一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java8 Collectors求和功能的自定義擴展操作

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

2021-08-13 11:43Jaemon Java教程

這篇文章主要介紹了Java8 Collectors求和功能的自定義擴展操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

自定義工具類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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> {
    // 創建一個計算用的容器
    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;
  }
}

自定義函數式接口

?
1
2
3
4
@FunctionalInterface
public interface ToBigDecimalFunction<T> {
  BigDecimal applyAsInt(T value);
}

測試入口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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擴展接口 實現BigDecimal的相加

第一步

創建ToBigDecimalFunction接口

?
1
2
3
4
5
import java.math.BigDecimal;
@FunctionalInterface
public interface ToBigDecimalFunction<T> {
  BigDecimal applyAsBigDecimal(T value);
}

第二步

創建工具類 實現接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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);
  }
}

使用測試

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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(){
    /*
    自定義實現對分組后的集合,屬性為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);
  }
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。如有錯誤或未考慮完全的地方,望不吝賜教。

原文鏈接:https://jaemon.blog.csdn.net/article/details/103405970

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女污视频在线观看 | a级毛片毛片免费很很综合 a级黄色视屏 | 欧美专区在线视频 | 日韩永久在线观看免费视频 | 青青热久麻豆精品视频在线观看 | 天天久久综合网站 | 波多野结衣 在线播放 | 嘉嘉的丝袜美腿白丝 | 13 sewang41| 扒开黑女人p大荫蒂老女人 扒开大腿狠狠挺进视频 | 国产精品日韩在线观看 | 国产成人精品免费视频大全五级 | 日本亚洲欧洲高清有码在线播放 | 久久综合亚洲色hezyo | 红楼影视h38bar在线线播放 | 操男孩| 亚洲色图色 | 亚洲精品国产一区二区在线 | 欧美日韩亚洲第一区在线 | 91色+91sesex| 国产资源一区 | 亚洲精品久久久成人 | 国产成人亚洲综合网站不卡 | 亚洲国产综合久久久无码色伦 | 色综合伊人色综合网亚洲欧洲 | 色噜噜狠狠狠综合曰曰曰88av | 亚洲一级视频在线观看 | 亚洲一区二区精品视频 | 美女扒开腿让男人桶爽免费gif | 久久久久久久国产精品视频 | 久久人妻无码毛片A片麻豆 久久热这里只有 精品 | 国产精品久久久久久久久ktv | 日本视频中文字幕 | bt天堂午夜国产精品 | 91精品国产91热久久久久福利 | 欧美日本一区视频免费 | 护士videossexo另类 | 手机在线伦理片 | 韩国成人毛片aaa黄 含羞草国产亚洲精品岁国产精品 | 女bbbbxxx孕妇| 亚洲欧美另类第一页 |