2 回答
TA贡献1864条经验 获得超6个赞
你可以这样做,
Map<Integer, Coll> colsByI = listTwo.stream()
.collect(Collectors.toMap(Coll::getI, Function.identity()));
List<Coll> commonElements = listOne.stream()
.filter(c -> Objects.nonNull(colsByI.get(c.getI())) && c.getI().equals(colsByI.get(c.getI()).getI()))
.map(c -> new Coll(c.getI(), c.getJ() * 1000))
.collect(Collectors.toList());
TA贡献1786条经验 获得超13个赞
将逻辑移到i外面收集Stream2 的所有内容。然后过滤流1中的所有内容Coll,如果它i存在于另一个列表中。
List<Integer> secondCollStreamI = stream2
.map(Coll::getI)
.collect(Collectors.toList());
Stream<Coll> common = stream1
.filter(coll -> secondCollStreamI.contains(coll.getI()));
common.forEach( x-> x.setJ(x.getJ()*1000));
common.forEach(x -> System.out.println(x));
最后一条语句将产生IllegalStateException( stream has already been operated upon or closed),因为您不能重用该流。你需要在某个地方把它收集到一个List<Coll>......像......
List<Coll> common = stream1
.filter(coll -> secondCollStreamI.contains(coll.getI()))
.collect(Collectors.toList());
common.forEach(x -> x.setJ(x.getJ() * 1000));
common.forEach(System.out::println);
或者,如果您想在不收集的情况下即时完成所有操作
stream1
.filter(coll -> secondCollStreamI.contains(coll.getI()))
.forEach(x-> {
x.setJ(x.getJ()*1000);
System.out.println(x);
});
添加回答
举报