gpt4 book ai didi

java - 从流中过滤可为空的值并更新可为空的属性

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:14:23 25 4
gpt4 key购买 nike

如果我有一个 Stream<@Nullable Object> ,我可以像这样过滤空元素:

Stream<@Nullable Object> s = str.filter(Objects::nonNull);

然而,这会返回一个可空对象流。有没有一种优雅的方式来返回一个非空元素流?在这个地方我已经知道元素不能为空。

这是我想出的,但是它太长了,imo:

Stream<@NonNull Object> s = str.map(Optional::ofNullable).filter(Optional::isPresent).map(Optional::get)

(这意味着 Optional::get 将始终返回非空值)

最佳答案

嗯,所有解决方案都基于 OptionalObjects假设检查者知道他们的方法的语义,因为他们没有明确的注释。

filter从不更改类型,需要检查器的深入支持才能将其建模为 Stream<@Nullable X>Stream<@NonNull X>转换,即使它理解过滤器函数的语义。

更简单的方法是使用 map因为它允许更改元素类型:

Stream<@NonNull Object> s = str.filter(Objects::nonNull).map(Objects::requireNonNull);

这里,过滤操作确保没有null元素,但不改变正式的元素类型。相比之下,map操作允许改变形式类型,函数Objects::requireNonNull将可空输入转换为非空输出,假设审计工具知道这一点,如前所述,这些 JRE 提供的方法没有注释。

requireNonNull将为 null 抛出异常值,只有 filter 的组合和 map允许删除 null 的期望行为值和更改正式元素类型。

如果审计工具不理解 JRE 方法的语义,您将不得不自己创建一个等效的方法,然后使用注释,

class MyObjUtil {
public static <T> @NonNull T requireNonNull(@Nullable T obj) {
if(obj==null) throw new NullPointerException();
return obj;
}
}

任何合理的检查器都应将其识别为正确的,并将其用作

Stream<@NonNull Object> s = str.filter(Objects::nonNull).map(MyObjUtil::requireNonNull);

你的 Optional基于方法可以使用 Java 9 进行简化:

Stream<@NonNull Object> s = str.flatMap(o -> Optional.ofNullable(o).stream());

还可以进一步简化:

Stream<@NonNull Object> s = str.flatMap(o -> Stream.ofNullable(o));

当然,这又需要一个理解这些方法的工具。或者你重新实现逻辑:

class MyStreamUtil {
public static <T> Stream<@NonNull T> ofNullable(@Nullable T obj) {
return obj==null? Stream.empty(): Stream.of(obj);
}
}
Stream<@NonNull Object> s = str.flatMap(o -> MyStreamUtil.ofNullable(o));

然后它也可以在 Java 8 下工作。

关于java - 从流中过滤可为空的值并更新可为空的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38457419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com