我有一些带有 lambda 的函数,它返回一些对象或 null
public Function<SomeObject1, SomeObject2> lambdaFunc = obj1 -> {
// here I do some logic, convert obj1 to obj2 and on the end return obj2 or null
};
我在我的流中使用该函数,如下所示:
someObj0.setObjects2(entity.getObjects1().stream().map(lambdaFunc).collect(Collectors.toSet()));
这里,当lambdaFunc
返回null时,我得到了异常,我认为这是由于收集函数所致。有一些漂亮的解决方案可以做到这一点吗?如果当 lambdaFunc 返回 null 时该流也返回 null,并且不继续,我会没事的。
编辑1:
好的,我尝试了 filter(Objects::nonNull)
函数,但我发现问题出在 entity.getObjects1()
所以我需要阻止调用流函数,如果它返回 null,任何想法?
最佳答案
您可以简单地添加对非空值的过滤:
someObj0.setObjects2(
Optional.ofNullable(entity.getObjects1())
.orElse(Coollections.emptyList()) // return original Object or singleton empty from Collections
.stream()
.map(lambdaFunc)
.filter(Objects::nonNull) // add checking here
.collect(Collectors.toSet()));
这里你有两个选择:
首先是将 getObjects1() 包装在Optional中
第二个会更干净 - 永远不会返回 null,在开始时用空集合初始化您的对象。 返回集合的方法不应返回 null,而应返回 Collections util 类中的空集合。这样您就不必担心空值。
所以
class SomeObj0 {
private List<SomeObject1> col =Collections.emptyList();
// getters/setters
}
我假设您的 Collection 是一个列表,但您可以使用可选来阻止它:)
关于java - 在 Stream 中使用 null 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47434887/