import static java.util.Comparator.comparingLong; import static java.util.stream.Collectors.collectingAndThen; import static java.util.stream.Collectors.toCollection; // 根据id去重 List<Person> unique = persons.stream().collect( collectingAndThen( toCollection(() -> new TreeSet<>(comparingLong(Person::getId))), ArrayList::new) );
分析:
collect是一个终端操作,它接收的参数是将流中的元素累积到汇总结果的各种方式(称为收集器)
预定义收集器包括将流元素归约和汇总到一个值.如下
工厂方法 返回类型 作用
collectingAndThen 转换函数返回的类型 包裹另一个转换器,对其结果应用转换函数
示例:Int count=Menu.getMenus.stream().collect(collectingAndThen(toList(),List::size))
toCollection Collection<T> 把流中所有元素收集到给定的供应源创建的集合中
示例:ArrayList<Menu> menus=Menu.getMenus.stream().collect(Collectors.toCollection(ArrayList::new))
Comparator.comparing(Function keyExtractor)生成1个Comparator对象,要求keyExtractor.apply()返回值一定要实现Comparable接口。从Student对象中提取id属性,而id是int类型(Integer实现了Comparable)。comparingDouble()、comparingLong()、comparingInt()不过是comparing()更具体的版本,使用方式相同。如果是字符串比较用Comparator.comparing(Human::getName)