• 例句
ArrayList<BwctOrgBasicVo> collect = bwJsonResultDto.getData().stream().collect(
        Collectors.collectingAndThen(
                Collectors.toCollection(()
                        -> new TreeSet<>(Comparator.comparing(
                        bwctOrgBasicVo ->
                                bwctOrgBasicVo.getTaxNo()))), ArrayList::new)
);
1. stream()
  • 这意味着你正在对某个集合进行流操作,比如ListSet
  • stream()会将集合转换为一个流,以便可以使用流操作进行处理。
2. Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(bwctOrgBasicVo -> bwctOrgBasicVo.getTaxNo())))
  • 这个部分将流中的元素收集到一个TreeSet中。
  • TreeSet是一个有序的集合,且不允许重复元素。
  • Comparator.comparing(bwctOrgBasicVo -> bwctOrgBasicVo.getTaxNo())是一个比较器,指定如何比较元素。这里比较的是每个元素的taxNo字段,确保具有相同taxNo的对象只保留一个(即去除重复的taxNo)。
3. Collectors.collectingAndThen(… , ArrayList::new)
  • Collectors.collectingAndThen是一个组合操作,它先执行前面的收集操作(即将流元素收集到TreeSet中),然后再对结果进行一个后处理操作。
  • ArrayList::new是一个方法引用,它将TreeSet转换为一个新的ArrayList

总结:

  • 这段代码的作用是从一个流中去除重复的taxNo元素(基于taxNo字段),然后将结果收集到一个ArrayList中。
  • 由于TreeSet会根据taxNo字段去重并排序,最终的ArrayList中的元素是唯一的,并且按照taxNo排序。

这个方法非常实用,当你想要去重并保留元素顺序时,尤其是基于对象中的某个特定字段进行去重。

Comparator.comparing是Java 8引入的用于简化对象比较的静态方法之一,它可以基于对象的某个字段生成一个比较器(Comparator),并且与Stream API很好地结合使用。

Comparator语法

Comparator.comparing(Function<? super T, ? extends U> keyExtractor)
  • keyExtractor:这是一个函数,用于从对象中提取出一个可以比较的键值(key),例如某个字段。

使用场景

Comparator.comparing主要用于根据对象的一个或多个字段进行排序。它让比较器的编写更加简洁,特别是在进行链式比较时。

示例

1. 按照单一字段排序

假设有一个Person类:

class Person {
    String name;
    int age;

    // 构造函数、getter和setter略
}

现在,我们希望对Person对象的列表按name字段进行排序:

List<Person> people = Arrays.asList(
    new Person("Alice", 30),
    new Person("Bob", 25),
    new Person("Charlie", 35)
);

people.sort(Comparator.comparing(Person::getName));
  • 这段代码会根据name字段的字母顺序对Person列表进行排序。
2. 按照多个字段排序

有时需要按多个字段排序,例如先按age排序,再按name排序。可以使用thenComparing来进行链式比较:

people.sort(Comparator.comparing(Person::getAge).thenComparing(Person::getName));
  • 这段代码会首先按age字段排序,如果age相同,则再按name字段排序。
3. 按照字段的逆序排序

如果希望按照字段的逆序排序,可以使用Comparator.comparing结合Comparator.reverseOrder()

people.sort(Comparator.comparing(Person::getAge, Comparator.reverseOrder()));
  • 这段代码会按照age字段的逆序排序。
4. 忽略大小写排序

对于String类型的字段,如果需要忽略大小写进行排序,可以使用String.CASE_INSENSITIVE_ORDER

people.sort(Comparator.comparing(Person::getName, String.CASE_INSENSITIVE_ORDER));
  • 这段代码会忽略大小写,根据name字段排序。
5. 使用Lambda表达式进行自定义排序

除了方法引用外,也可以使用Lambda表达式指定自定义的排序逻辑。例如,如果我们需要根据名字的长度排序:

people.sort(Comparator.comparing(person -> person.getName().length()));
  • 这段代码会根据name字段的长度来排序。

总结