zoukankan      html  css  js  c++  java
  • Java 8 新特性 Stream类的collect方法

    1.Collectors.toList():转换成List集合。/ Collectors.toSet():转换成set集合。

    System.out.println(Stream.of("a", "b", "c","a").collect(Collectors.toSet()));

    2.Collectors.toCollection(TreeSet::new):转换成特定的set集合。

    TreeSet<String> treeSet = Stream.of("a", "c", "b", "a").collect(Collectors.toCollection(TreeSet::new));
    System.out.println(treeSet);

    3.Collectors.toMap(keyMapper, valueMapper, mergeFunction):转换成map。

    Map<String, String> collect = Stream.of("a", "b", "c", "a").collect(Collectors.toMap(x -> x, x -> x + x,(oldVal, newVal) -> newVal)));
    collect.forEach((k,v)
    -> System.out.println(k + ":" + v));

    补充

    关于合并函数 BinaryOperator<U> mergeFunction对象

    当toMap中没有用合并函数时,出现key重复时,会抛出异常 :  Exception in thread "main" java.lang.IllegalStateException: Duplicate key aa

    当使用合并函数时,可通过Labmda表达式,对重复值进行处理

    4.Collectors.minBy(Integer::compare):求最小值,相对应的当然也有maxBy方法。

    5.Collectors.averagingInt(x->x):求平均值,同时也有averagingDouble、averagingLong方法。

    6.Collectors.summingInt(x -> x)):求和。

    7.Collectors.summarizingDouble(x -> x):可以获取最大值、最小值、平均值、总和值、总数。

    DoubleSummaryStatistics summaryStatistics = Stream.of(1, 3, 4).collect(Collectors.summarizingDouble(x -> x));
    System.out.println(summaryStatistics .getAverage());

    8. Collectors.groupingBy(x -> x):有三种方法,查看源码可以知道前两个方法最终调用第三个方法,
    第二个参数默认HashMap::new  第三个参数默认Collectors.toList()

    Map<Integer, List<Integer>> map = Stream.of(1, 3, 3, 2).collect(Collectors.groupingBy(Function.identity()));
    System.out.println(map);
    Map
    <Integer, Integer> map1 = Stream.of(1, 3, 3, 2).collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(x -> x))); System.out.println(map1);
    HashMap
    <Integer, List<Integer>> hashMap = Stream.of(1, 3, 3, 2).collect(Collectors.groupingBy(Function.identity(), HashMap::new, Collectors.mapping(x -> x + 1, Collectors.toList()))); System.out.println(hashMap);
    补充: identity()是Function类的静态方法,和 x->x 是一个意思,
    当仅仅需要自己返回自己时,使用
    identity()能更清楚的表达作者的意思.
    写的复杂一点,绕一点,对理解很有好处.下边是运行结果:

     9.Collectors.partitioningBy(x -> x > 2),把数据分成两部分,key为ture/false。第一个方法也是调用第二个方法,第二个参数默认为Collectors.toList()

    Map<Boolean, List<Integer>> map = Stream.of(1, 3, 3, 2).collect(Collectors.partitioningBy(x -> x > 2));
    Map<Boolean, Long> longMap = Stream.of(1, 3, 3, 2).collect(Collectors.partitioningBy(x -> x > 1, Collectors.counting()));

    10.Collectors.joining(","):拼接字符串。

    System.out.println(Stream.of("1", "3", "3", "2").collect(Collectors.joining(",")));

    11.Collectors.collectingAndThen(Collectors.toList(), x -> x.size()):先执行collect操作后再执行第二个参数的表达式。这里是先塞到集合,再得出集合长度。

    Integer integer = Stream.of("1", "2", "3").collect(Collectors.collectingAndThen(Collectors.toList(), x -> x.size()));

    12.Collectors.mapping(...):跟Stream的map操作类似,只是参数有点区别

    System.out.println(Stream.of(1, 3, 5).collect(Collectors.mapping(x -> x + 1, Collectors.toList())));
  • 相关阅读:
    算法-转
    单页 SEO-转
    浅谈MVVM设计模式
    iOS-UIView动画
    iOS 核心动画(下)
    iOS开发-核心动画(Core Animation)
    iOS-CALayer的介绍
    SVN Xcode不能提交.a文件
    iOS 毛玻璃效果
    Quartz2D学习总结
  • 原文地址:https://www.cnblogs.com/Deters/p/11137532.html
Copyright © 2011-2022 走看看