java 8 Collectors.collectingAndThen()使用排序去重

排序去重

Collectors.collectingAndThen()是Java 8中的一个辅助方法,它能够将一个Collector收集器转换为另一个收集器,并在最终收集结果上应用一个Function函数。

public static <T, A, R, RR> Collector<T, ?, RR> collectingAndThen(Collector<T, A, R> downstream,
                                                                   Function<R, RR> finisher)

该方法接受两个参数:downstream和finisher。其中,downstream是一个普通的Collector收集器,用于对数据流中的元素进行收集操作;而finisher是一个Function函数,用于对downstream的收集结果进行处理,并返回最终的结果。

该方法的作用可以简单地概括为“先收集,再做一些操作”。例如,我们可以利用collectingAndThen()方法来对一个List集合进行去重和排序的操作,示例代码如下:

List<Integer> list = Arrays.asList(2, 1, 4, 3, 5, 4);
List<Integer> result = list.stream()
                            .collect(Collectors.collectingAndThen(
                                Collectors.toCollection(() -> new TreeSet<>(Comparator.naturalOrder())),
                                ArrayList::new));
System.out.println(result); // 输出 [1, 2, 3, 4, 5]

在上述代码中,我们首先使用Collectors.toCollection()方法创建了一个TreeSet集合,然后将其作为downstream传递给collectingAndThen()方法。由于TreeSet本身具有去重和排序的功能,因此我们可以直接通过该集合来实现去重和排序的操作。最后,再将TreeSet集合转换为ArrayList集合,得到最终的结果。

另一种方式:

list.stream()
                    .collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(JsWsbsStuStampDuty::getDutyDetailId))))
                    .stream()
                    .collect(Collectors.toCollection(ArrayList::new));

collectingAndThen()方法并不会改变downstream收集器的行为,而只是对其结果进行了一些额外的处理。因此,如果downstream本身就是一个具有去重和排序功能的收集器,那么使用collectingAndThen()方法可能会显得有些冗余。

你可能感兴趣的:(java)