java中collector使用_Java 8手动实现一个Collector

我们看一下Stream中的collect的方法。

f1cbd344a4b1998c234e744469da1c03.png

collect(toList())方法由Stream里的值生成一个列表,是一个及早求值的操作。

Stream的of方法使用一个初始值生成新的Stream。事实上,collect的使用方法不仅限于此,它是一个非常通用的强大结构。

下面我们看一下用法:

22dd5b69d2d11fcf07759f91b600395f.png

运行结果如上图。

由于很多Stream操作都是惰性求值,因此调用Stream上的一系列方法后,还需要最后调用类似collect这样的及早求值的方法。

Collectors这个类中有很多自定义的Collector,顾名思义Collector的字面意思是收集器,意思就是对Stream流里面的元素进行收集,按照收集器的方式进行收集。

例如上面的Collectors.toList()收集器,收集成了List。

现在我们看一下Collectors另外一个方法。

7e97a6f5e1019c72efc02d6739828e0d.png

当然Collectors中还有很多重载的groupingBy的方法,这里我们不再关心。这个方法的意思就是对一个Stream中的元素进行分类,通过流中元素本身的一个方法的返回值作为分类的标准,返回一个以刚才返回值作为key,包含相同方法返回相同key元素的类的List作为Map的值。

使用场景:

比如通过jpa从数据库中查出了一个包含多个结果的List。此时我们需要对List中的元素进行分类,比如我们想把相同年龄的分在一起,这时这个方法就很合适。

Map result = list.Stream.collect(Collectors.groupingBy(Bean::getAge));

这样我们就对list中的Bean按照年龄进行分类。

下面我们自己手动实现一个这样的Collectors.groupingBy()。

packagemycollector;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.function.BiConsumer;importjava.util.function.BinaryOperator;importjava.util.function.Function;importjava.util.function.Supplier;importjava.util.stream.Collector;importjava.util.stream.Collector.Characteristics;public classMyCollector

{

@SuppressWarnings("unchecked")public static >, M> Collector groupingby(Functionclassifier)

{

Supplier supplier = () ->{return (R)new HashMap>();

};

BiConsumer biConsumer = (m, t) ->{

M r=classifier.apply(t);if(!m.containsKey(r))

m.put(r,new ArrayList());

m.get(r).add(t);

};

BinaryOperator binaryOperator = (R left, R right) ->{

left.putAll(right);returnleft;

};returnCollector.of(supplier, biConsumer, binaryOperator, Characteristics.IDENTITY_FINISH);

}

}

下面然我们进行测试,输入几个字符串按照字符串的长度进行分类。

314ddb307679ac22cba8cb257a8f3b4b.png

好了就是这些。

以上的内容大部分来自王群锋先生翻译的《java 8函数式编程》一书。感谢原著作者和王群锋先生在书中对java函数式编程的详尽的分析和翻译,从中受益良多。谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值