如何高效收集列表中对象的同类型多属性值?
收集对象列表中多个同类型属性值的最优方式
你当前的写法需要遍历列表两次来分别收集两个属性值,再合并到Set中,当数据量较大时会有额外的遍历开销。下面是几种更高效的实现方式,均只需一次遍历即可完成:
方式1:使用flatMap合并流
这是最符合Stream API风格的写法,通过flatMap将每个对象转换为包含两个ID的流,再合并为单一流后收集到Set:
Set<Long> allIds = is.stream() .flatMap(issue -> Stream.of(issue.getId1(), issue.getId2())) .collect(Collectors.toSet());
方式2:处理可能的null值
如果id1或id2存在为null的情况,可添加过滤步骤避免null被加入Set:
import java.util.Objects; Set<Long> allIds = is.stream() .flatMap(issue -> Stream.of(issue.getId1(), issue.getId2()) .filter(Objects::nonNull)) .collect(Collectors.toSet());
方式3:命令式的forEach写法
如果偏好更直观的命令式风格,直接通过forEach遍历一次并添加两个ID:
Set<Long> allIds = new HashSet<>(); is.forEach(issue -> { allIds.add(issue.getId1()); allIds.add(issue.getId2()); });
对比原写法的优势
原代码需要两次遍历列表,而上述三种方式均只需一次遍历,在列表规模较大时能显著减少遍历开销,同时代码更紧凑简洁。
内容的提问来源于stack exchange,提问作者S.Dan
相关产品推荐
相关产品推荐

