- 例句
1. stream()
- 这意味着你正在对某个集合进行流操作,比如
List
或Set
。 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语法
keyExtractor
:这是一个函数,用于从对象中提取出一个可以比较的键值(key
),例如某个字段。
使用场景
Comparator.comparing
主要用于根据对象的一个或多个字段进行排序。它让比较器的编写更加简洁,特别是在进行链式比较时。
示例
1. 按照单一字段排序
假设有一个Person
类:
现在,我们希望对Person
对象的列表按name
字段进行排序:
- 这段代码会根据
name
字段的字母顺序对Person
列表进行排序。
2. 按照多个字段排序
有时需要按多个字段排序,例如先按age
排序,再按name
排序。可以使用thenComparing
来进行链式比较:
- 这段代码会首先按
age
字段排序,如果age
相同,则再按name
字段排序。
3. 按照字段的逆序排序
如果希望按照字段的逆序排序,可以使用Comparator.comparing
结合Comparator.reverseOrder()
:
- 这段代码会按照
age
字段的逆序排序。
4. 忽略大小写排序
对于String
类型的字段,如果需要忽略大小写进行排序,可以使用String.CASE_INSENSITIVE_ORDER
:
- 这段代码会忽略大小写,根据
name
字段排序。
5. 使用Lambda表达式进行自定义排序
除了方法引用外,也可以使用Lambda表达式指定自定义的排序逻辑。例如,如果我们需要根据名字的长度排序:
- 这段代码会根据
name
字段的长度来排序。