java - 在 Stream 中使用 null 值

标签 java lambda java-stream

我有一些带有 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/

相关文章:

java - 为什么list上stream操作时生成的map顺序不对

java - 将一个元素与列表中的每个其他元素相加

java - Jenkins - mvn 未找到

java - 如何索引 java.util.Collections$UnmodifyingMap 的类类型?

java - 如何获取 Java 8 方法引用的 MethodInfo?

lambda - 基于 Java 中的另外两个 map 创建 Map

java - 错误 : stack depth limit exceeded - Java hibernate postgresql

java - Android开发者文档IntentService : Are we defining the same class twice?

python - 使用通过迭代计算的函数填充 numpy 矩阵

java - 如何在 Java8 流/过滤器中使用非最终变量?