最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8 Collectors求和功能的自定義擴展操作

 更新時間:2021年02月24日 16:04:10   作者:Jaemon  
這篇文章主要介紹了Java8 Collectors求和功能的自定義擴展操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

業(yè)務中需要將一組數(shù)據(jù)分類后收集總和,原本可以使用Collectors.summingInt(),但是我們的數(shù)據(jù)源是BigDecimal類型的,而Java8原生只提供了summingInt、summingLong、summingDouble三種基礎(chǔ)類型的方法。

于是就自己動手豐衣足食吧。。

自定義工具類

public class MyCollectors {
  private MyCollectors() {
  }
//  public static <T> Collector<T, ?, BigDecimal> summingBigDecimal(Function<? super T, BigDecimal> mapper) {}
 	// BigDecimal 類型的集合求和
  public static <T> Collector<T, ?, BigDecimal> summingBigDecimal(ToBigDecimalFunction<? super T> mapper) {
    return new CollectorImpl<>(
        () -> new BigDecimal[] { BigDecimal.ZERO },
        (a, t) -> a[0] = a[0].add(mapper.applyAsInt(t)),
        (a, b) -> {
          a[0] = a[0].add(b[0]);
          return a;
        },
        a -> a[0],
        Collections.emptySet()
    );
  }
  static class CollectorImpl<T, A, R> implements Collector<T, A, R> {
    // 創(chuàng)建一個計算用的容器
    private final Supplier<A> supplier;
    // 計算邏輯
    private final BiConsumer<A, T> accumulator;
    // 合并邏輯
    private final BinaryOperator<A> combiner;
    // 返回最終計算值
    private final Function<A, R> finisher;
    // 空Set
    private final Set<Characteristics> characteristics;
    CollectorImpl(Supplier<A> supplier, BiConsumer<A, T> accumulator, BinaryOperator<A> combiner,
           Function<A, R> finisher, Set<Characteristics> characteristics) {
      this.supplier = supplier;
      this.accumulator = accumulator;
      this.combiner = combiner;
      this.finisher = finisher;
      this.characteristics = characteristics;
    }
    CollectorImpl(Supplier<A> supplier, BiConsumer<A, T> accumulator, BinaryOperator<A> combiner,
           Set<Characteristics> characteristics) {
      this(supplier, accumulator, combiner, castingIdentity(), characteristics);
    }
    @Override
    public BiConsumer<A, T> accumulator() {
      return accumulator;
    }
    @Override
    public Supplier<A> supplier() {
      return supplier;
    }
    @Override
    public BinaryOperator<A> combiner() {
      return combiner;
    }
    @Override
    public Function<A, R> finisher() {
      return finisher;
    }
    @Override
    public Set<Characteristics> characteristics() {
      return characteristics;
    }
  }
  @SuppressWarnings("unchecked")
  private static <I, R> Function<I, R> castingIdentity() {
    return i -> (R) i;
  }
}

自定義函數(shù)式接口

@FunctionalInterface
public interface ToBigDecimalFunction<T> {
  BigDecimal applyAsInt(T value);
}

測試入口

public class AnswerApp {
 public static void main(String[] args) {
    List<BigDecimal> list = Lists.newArrayList();
    for (int i = 0; i < 24; i++) {
      list.add(BigDecimal.valueOf(i + 10.2121543));
    }
    // 方式1
    BigDecimal sum = list.stream().collect(MyCollectors.summingBigDecimal(e -> e));
    System.out.println(sum.doubleValue());
    // 方式2
    Optional<BigDecimal> reduce = list.stream().reduce(BigDecimal::add);
    System.out.println(reduce.orElse(BigDecimal.valueOf(0)));
 }    
}
// OUTPUT: 521.0917032

補充:Collectors擴展接口 實現(xiàn)BigDecimal的相加

第一步

創(chuàng)建ToBigDecimalFunction接口

import java.math.BigDecimal;
@FunctionalInterface
public interface ToBigDecimalFunction<T> {
  BigDecimal applyAsBigDecimal(T value);
}

第二步

創(chuàng)建工具類 實現(xiàn)接口

import java.math.BigDecimal;
import java.util.Collections;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
public class CollectorsUtil {
  static final Set<Collector.Characteristics> CH_NOID = Collections.emptySet();
  private CollectorsUtil() {
  }
  @SuppressWarnings("unchecked")
  private static <I, R> Function<I, R> castingIdentity() {
    return i -> (R) i;
  }
  /**
   * Simple implementation class for {@code Collector}.
   *
   * @param <T>
   *      the type of elements to be collected
   * @param <R>
   *      the type of the result
   */
  static class CollectorImpl<T, A, R> implements Collector<T, A, R> {
    private final Supplier<A> supplier;
    private final BiConsumer<A, T> accumulator;
    private final BinaryOperator<A> combiner;
    private final Function<A, R> finisher;
    private final Set<Characteristics> characteristics;
    CollectorImpl(Supplier<A> supplier, BiConsumer<A, T> accumulator, BinaryOperator<A> combiner,
           Function<A, R> finisher, Set<Characteristics> characteristics) {
      this.supplier = supplier;
      this.accumulator = accumulator;
      this.combiner = combiner;
      this.finisher = finisher;
      this.characteristics = characteristics;
    }
    CollectorImpl(Supplier<A> supplier, BiConsumer<A, T> accumulator, BinaryOperator<A> combiner,
           Set<Characteristics> characteristics) {
      this(supplier, accumulator, combiner, castingIdentity(), characteristics);
    }
    @Override
    public BiConsumer<A, T> accumulator() {
      return accumulator;
    }
    @Override
    public Supplier<A> supplier() {
      return supplier;
    }
    @Override
    public BinaryOperator<A> combiner() {
      return combiner;
    }
    @Override
    public Function<A, R> finisher() {
      return finisher;
    }
    @Override
    public Set<Characteristics> characteristics() {
      return characteristics;
    }
  }
  public static <T> Collector<T, ?, BigDecimal> summingBigDecimal(ToBigDecimalFunction<? super T> mapper) {
    return new CollectorImpl<>(() -> new BigDecimal[1], (a, t) -> {
      if (a[0] == null) {
        a[0] = BigDecimal.ZERO;
      }
      a[0] = a[0].add(mapper.applyAsBigDecimal(t));
    }, (a, b) -> {
      a[0] = a[0].add(b[0]);
      return a;
    }, a -> a[0], CH_NOID);
  }
}

使用測試

import com.example.javademo.JavaDemoApplicationTests;
import com.example.javademo.pojo.Student;
import com.example.javademo.utils.DataUtils;
import org.junit.Test;
import java.math.BigDecimal;
import java.util.stream.Collectors;
public class TestBigDecimal extends JavaDemoApplicationTests {
  @Test
  public void testGroupByAfterBigdecimal(){
    /*
    自定義實現(xiàn)對分組后的集合,屬性為bigdecmal進行相加
     */
    System.out.println(DataUtils.getData().stream().collect(Collectors.groupingBy(Student::getSchool,CollectorsUtil.summingBigDecimal(Student::getMoney))));
    //歸約造作
    BigDecimal reduce = DataUtils.getData().stream().map(Student::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
    System.out.println(reduce);
    int sum = DataUtils.getData().stream().mapToInt(Student::getAge).sum();
    System.out.println(sum);
  }
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Spring:bean注入--Set方法注入

    Spring:bean注入--Set方法注入

    這篇文章主要給大家總結(jié)介紹了關(guān)于Spring注入Bean的一些方式,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2021-07-07
  • 淺談jvm中的垃圾回收策略

    淺談jvm中的垃圾回收策略

    下面小編就為大家?guī)硪黄獪\談jvm中的垃圾回收策略。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • Java實現(xiàn)數(shù)組去除重復數(shù)據(jù)的方法詳解

    Java實現(xiàn)數(shù)組去除重復數(shù)據(jù)的方法詳解

    這篇文章主要介紹了Java實現(xiàn)數(shù)組去除重復數(shù)據(jù)的方法,結(jié)合實例形式詳細分析了java數(shù)組去除重復的幾種常用方法、實現(xiàn)原理與相關(guān)注意事項,需要的朋友可以參考下
    2017-09-09
  • Hadoop源碼分析一架構(gòu)關(guān)系簡介

    Hadoop源碼分析一架構(gòu)關(guān)系簡介

    本篇是Hadoop源碼分析系列文章第一篇,主要介紹一下Hadoop的基礎(chǔ)簡介以及框架關(guān)系,后續(xù)本系列文章會持續(xù)更新,有需要的朋友可以借鑒參考下
    2021-09-09
  • Java實現(xiàn)終止線程池中正在運行的定時任務

    Java實現(xiàn)終止線程池中正在運行的定時任務

    本篇文章給大家分享了JAVA中實現(xiàn)終止線程池中正在運行的定時任務的具體步驟和方法,有需要的朋友跟著學習下。
    2018-05-05
  • Mybatis Update操作返回值問題

    Mybatis Update操作返回值問題

    在獲取update操作的返回值時遇到了一個問題,似乎 Mybatis 進行 update 操作得到的 int 返回值并不是影響的行數(shù),下面通過本文給大家分享Mybatis Update操作返回值問題,需要的朋友參考下吧
    2017-09-09
  • Spring配置文件解析之BeanDefinitionReader詳解

    Spring配置文件解析之BeanDefinitionReader詳解

    這篇文章主要介紹了Spring配置文件解析之BeanDefinitionReader詳解,ApplicationContext.xml配置文件解析成Document對象,真正對xml中元素解析的類是在BeanDefinitionDocumentReader的實現(xiàn)類中來完成的,需要的朋友可以參考下
    2024-02-02
  • Java正則表達式——group方法的使用

    Java正則表達式——group方法的使用

    這篇文章主要介紹了Java正則表達式group方法的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • java 商戶PC端接入支付寶支付的實現(xiàn)方法

    java 商戶PC端接入支付寶支付的實現(xiàn)方法

    這篇文章主要介紹了java 商戶PC端接入支付寶支付的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Java線程池高頻面試題總結(jié)

    Java線程池高頻面試題總結(jié)

    在進程和線程的相關(guān)面試題中還有一部分是關(guān)于多線程和線程池的,也是在這一部分中比較常考察的內(nèi)容。本篇文章就帶你了解一下,希望能給你帶來幫助
    2021-08-08

最新評論

樟树市| 文成县| 曲麻莱县| 平塘县| 姜堰市| 博客| 靖宇县| 方山县| 澄江县| 洪江市| 哈尔滨市| 门源| 静安区| 醴陵市| 定兴县| 宁国市| 澄迈县| 五寨县| 三门县| 伊金霍洛旗| 南皮县| 奇台县| 岚皋县| 龙州县| 嘉善县| 阳新县| 长宁区| 信宜市| 延寿县| 拜城县| 缙云县| 治县。| 奈曼旗| 佛冈县| 赣榆县| 东海县| 远安县| 赫章县| 杨浦区| 渑池县| 静安区|