如果结果为 null,Java 流将删除元素

问题描述 投票:0回答:1

我是 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;
}
java java-stream
1个回答
0
投票

您可以使用

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());
}
© www.soinside.com 2019 - 2024. All rights reserved.