我是 Java 流新手,我有一个简单的问题。
我有一个包含对象的列表。
List<Object> list = new ArrayList<>();
还有一个包含不同对象的第二个列表。
List<Object2> list2 = new ArrayList<>();
基本上我有一个过滤方法来检查是否满足某些条件。
如果条件为真:
将对象添加到列表
如果方法返回 null 或条件为 false:
过滤掉物体。
这是我尝试过的,但我想知道这种过滤的最佳实践是什么。
List<Objet> res = list.stream().filter(x -> x.status == Status.OLD).filter(x -> {
(findRelevantObject(x, list2)))
return x != null
})
.collect(Collectors.toList));
private Object findRelevantObject(Object x, List<list2> list2) {
boolean isExist = list2().stream().filter(m -> m.getId() == x.getId()).allMatch(m -> m.isToChangeNum() == 1);
return isExist ? x : null;
}
您可以使用
groupingBy
、reducingBy
和 Optional
,无需外部函数:
import static java.util.stream.Collectors.*;
Map<Integer, Boolean> idExistMap = list2.stream().collect(
groupingBy(A::getId, reducing(true, obj -> obj.isToChangeNum() == 1, (a, b) -> a && b)));
List<A> res = list.stream()
.filter(x -> x.status == Status.OLD)
.map(x -> idExistMap.getOrDefault(x.getId(), false) ? Optional.of(x) : Optional.empty())
.flatMap(Optional::stream) // This will remove any empty Optional
.collect(toList());
}