Java 8 Streams:如何将匹配生成的PersonWrapper存入指定列表?
解决PersonWrapper列表填充问题
你的核心问题是当前代码里Collectors.toList()生成的新列表没有被添加到wrapperList中,所以最终wrapperList是空的。下面给你两种可行的解决方案:
方案一:直接在Stream中添加到wrapperList
把collect(Collectors.toList())替换为forEach,直接将匹配生成的PersonWrapper添加到目标列表:
List<PersonWrapper> wrapperList = new ArrayList<>(); jrList.forEach(jr -> seniorList.stream() .filter(sr -> jr.getName().equals(sr.getName())) .forEach(sr -> wrapperList.add(new PersonWrapper(jr, sr))) );
这样每找到一个和jr同名的sr对象,就会立即创建PersonWrapper并加入wrapperList。
方案二:用Map优化性能(推荐)
如果你的列表数据量较大,上面的方法每次遍历jr都要全量扫描srList,时间复杂度是O(n*m)。更高效的方式是先把srList转成以name为key的Map,这样查找匹配只需要O(1)时间:
// 先将seniorList转换为name到Person的映射 Map<String, Person> seniorMap = seniorList.stream() .collect(Collectors.toMap(Person::getName, p -> p)); // 遍历jrList生成Wrapper列表 List<PersonWrapper> wrapperList = jrList.stream() // 根据name从Map中获取对应的srPerson .map(jr -> new PersonWrapper(jr, seniorMap.get(jr.getName()))) // 可选:过滤掉srList中没有对应name的情况(避免null) .filter(wrapper -> wrapper.getSrPerson() != null) .collect(Collectors.toList());
这种方式的时间复杂度是O(n+m),在数据量大的时候性能提升很明显,还能灵活处理srList中没有对应name的场景。
原代码问题说明
你之前的代码里,stream().filter().map().collect()生成了一个新的List<PersonWrapper>,但这个列表没有被任何变量接收,也没有添加到wrapperList中,所以wrapperList始终是空的,这就是为什么没有看到预期结果的原因。
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

