背景:
在实际业务中,可能需要把数据库查询出来数据的某一个字段(例如: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 生成的实例整合到一起的方法,代表着规约操作,将多个结果合并。
看完这个说明是不是就很容易懂了