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()能更清楚的表达作者的意思.
写的复杂一点,绕一点,对理解很有好处.下边是运行结果:

Java 8 新特性 Stream类的collect方法

 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())));

 

上一篇:tkinter,python和seaborn的问题:_tkinter.TclError:没有显示名称,没有$DISPLAY环境变量


下一篇:python-如何在Seaborn的簇图树形图中指定线宽