如何不使用for/while循环,通过Stream提取自定义类字段生成列表?
基于Java Stream API实现自定义Pair类字段提取与去重方案
你要的实现不需要任何显式for/while循环,核心是通过flatMap操作平铺每个Pair的两个字段,再做去重收集即可,完整实现代码如下:
import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class PairStreamDemo { public static void main(String[] args) { // 构造测试用的Pair列表 List<Pair<Integer, Integer>> pairList = List.of( new Pair<>(3, 5), new Pair<>(5, 7) ); // 核心Stream处理逻辑 List<Integer> result = pairList.stream() // 将每个Pair平铺为包含first、second两个元素的整数流 .flatMap(pair -> Stream.of(pair.first(), pair.second())) // 去重 .distinct() // 收集为列表 .collect(Collectors.toList()); // 输出结果:[3, 5, 7] System.out.println(result); } } // 你提供的Pair类定义 class Pair<T,U> { private final T first; private final U second; public Pair(T first, U second){ this.first = first; this.second = second; } T first() { return this.first; } U second(){ return this.second; } @Override public String toString(){ return "<" + this.first + ", "+ this.second+">"; } }
关键步骤说明
flatMap操作:负责把每个Pair对象转换成包含两个字段值的Stream,再把所有生成的小流合并成一个完整的整数字段流,是实现多字段提取不需要循环的核心distinct操作:依赖Integer类原生实现的equals和hashCode方法完成重复值的过滤- 如果你要在其他包下调用Pair的
first()、second()方法,需要把这两个方法的访问权限改为public,否则会抛出访问权限异常
内容的提问来源于stack exchange,提问作者Heartless
相关产品推荐
相关产品推荐

