【第22期】观点:IT 行业加班,到底有没有价值?

Java8 学习笔记-stream-collection(2)

原创 2017年01月04日 19:15:45

这一遍是继上一篇collection的补充.

上篇, 我们创建了Map的一个实例, 但是不能适用于很多情况

Collectors.groupingBy()

String[] names3 = { "Larry", "Lati", "Moe", "Curly", "Mobi" };


        Stream.of(names3).collect(Collectors.groupingBy(b -> b.charAt(0)))
                .forEach((key, value) -> {
                    System.out.println("Key : " + key + " Value : " + value);
                });

输出:
Key : C Value : [Curly]
Key : L Value : [Larry, Lati]
Key : M Value : [Moe, Mobi]




Stream.of(names3)
                .collect(
                        Collectors.groupingBy(b -> b.charAt(0),
                                Collectors.counting()))
                .forEach((key, value) -> {
                    System.out.println("Key : " + key + " Value : " + value);
                });
输出:
Key : C Value : 1
Key : L Value : 2
Key : M Value : 2

再参考一下解释文档

* @see #groupingBy(Function, Collector)
  * @see #groupingBy(Function, Supplier, Collector)
  * @see #groupingByConcurrent(Function)
 */
public static <T, K> Collector<T, ?, Map<K, List<T>>>
groupingBy(Function<? super T, ? extends K> classifier) {
    return groupingBy(classifier, toList());
}

这里我们可以看见, 这里有三个method, 也就是有三种方式可供选择, 并且返回值为Map

  1. Function 分组的原则 , 参考工具Function类
    A1 A2 A3 B1 B2 B3
    function为first letter
    结果: A [A1,A2,A3] B [B1,B2,B3]
  2. Collector
  3. Supplier

这里来讨论下参数Collector, 也就是Collectors.method究竟是用来干啥的.
API文档

Implementations of Collector that implement various useful reduction operations, such as accumulating elements into collections, summarizing elements according to various criteria, etc.

这里说道, collectors是用于做 various useful reduction operations.
然而新的问题, reduction operation 是什么意思?
字典上的意思是, 减少,缩图等 ,可是意思还是说不通

官方文档中写着

The JDK contains many terminal operations (such as average, sum, min, max, and count) that return one value by combining the contents of a stream. These operations are called reduction operations.

我认为是: 简化+组合的意思吧( 也就是具体操作的意思吧!? ), 不过这里, 理解为Map的value值产生的方式比较好.
看API文档, 有如下的操作

  • 集合: Accumulate(聚集),Group(分组) e.g toXXX
  • 字符串: 操作 e.g joining
  • 数字: summingInt
  • 布尔值: partitioningBy

回到正题, Collector和Supplier有什么用, Supplier相当于提供商, 也就是new object(),这一执行任务的对象, Collector则是该怎么处理数据, 这一个行为.
而Collectors.method 将上面两个行为结合在一起完成了, 也就是经常不需要Supplier这一参数啦


扩展学习:
mkyong-Java 8 – Stream Collectors groupingBy examples

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Java8 学习笔记-stream-collection

本篇讨论的是 : Java8集合(collection)的创建,初始化方式为什么是不同?

Java8 Stream类学习笔记

今天看了一下午的Stream类,写点学习笔记,感觉还是理解不完全,应该还会有Stream类的后续笔记。 先贴一段采取Stream类实现的求一个String数组里所有质数的程序(请无视掉那个guava...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

Java8 Stream API学习笔记

1.Stream-流 不同于I/O中的输入输出流,也不同于XML解析的流,此处的流是操作流。 就像一个工厂的流水线,原材料经过各种加工后成为成品,一个成品的诞生总是经过一次流水线的加工。 Jav...

Java8学习笔记 — 【Stream API】

Stream(java.util.stream.*)是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API对集合...

java8 Stream学习笔记

Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (b...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)