Stream中collect方法在业务中的使用

背景:
在实际业务中,可能需要把数据库查询出来数据的某一个字段(例如:ID等唯一值)添加到集合中

@Data
class Person{
    private Long id;
    private String name;
}

// 先查询数据库记录集合

List<Person>  personList = db.queryByCond(xxx);

// 需要将person中的id全部保存到新的List,也就是要实现如下功能

// 把ID添加到List
List<Long> ids = new ArrayList<>();
for (Person person : personList) {
    ids.add(person.getId());
}

// 或者要把name属性添加到List
List<String> names = new ArrayList<>();
for (Person person : personList) {
    names.add(person.getName());
}

很古老,1.8有lambda表达式如何实现昵?

// id添加到集合的结果
List<Long> ids = personList.stream().collect(ArrayList::new, (list, person) -> list.add(person.getId()), ArrayList::addAll);

// name添加到集合
List<String> ids = personList.stream().collect(ArrayList::new, (list, person) -> list.add(person.getName()), List::addAll);

当然name添加到集合实际开发中没有意义,但如果刚好有一个唯一字段也是字符串类型,是不是可以照猫画虎了!

对stream().collect方法的补充:

<R> R collect(Supplier<R> supplier,
    BiConsumer<R, ? super T> accumulator,
    BiConsumer<R, R> combiner);

参数supplier 是一个生成目标类型实例的方法,也就是你想要得到的数据类型;

accumulator是将操作的目标数据填充到supplier 生成的目标类型实例中去的方法,就是如何将元素添加到容器中;

combiner是将多个supplier 生成的实例整合到一起的方法,代表着规约操作,将多个结果合并。

看完这个说明是不是就很容易懂了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值