使用流 api 从 Stream<@Nullable T> 转换为 Stream<@NonNull T>
convert from Stream<@Nullable T> to Stream<@NonNull T> using stream api
我使用 CheckerFramework
如何从 Stream 中删除空值并获得 @NonNull 对象的集合?
Stream<@Nullable T> -> (remove nulls) -> Stream<@NonNull T>
这是执行此操作的代码。
import java.util.Objects;
import java.util.stream.Stream;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
class RemoveNullsFromStream {
@SuppressWarnings("nullness") // Nullness Checker is not hard-coded with
// implementation details of filter and Objects::nonNull
<T>
Stream<@NonNull T> removeNullsFromStream(Stream<@Nullable T> arg) {
return arg.filter(Objects::nonNull);
}
}
请注意 @SuppressWarnings
的使用,因为 Nullness Checker 是保守的:它会在无法明确证明代码安全时发出警告。通常,filter
的输出与其输入相同;当 filter
的参数是 Objects::nonNull
是一个特例。
special-case 可以 hard-coded 进入 Nullness Checker,这将使 Nullness Checker 更加精确。此行为当前未 special-cased,因此您改用 @SuppressWarnings
。
我使用 CheckerFramework
如何从 Stream 中删除空值并获得 @NonNull 对象的集合?
Stream<@Nullable T> -> (remove nulls) -> Stream<@NonNull T>
这是执行此操作的代码。
import java.util.Objects;
import java.util.stream.Stream;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
class RemoveNullsFromStream {
@SuppressWarnings("nullness") // Nullness Checker is not hard-coded with
// implementation details of filter and Objects::nonNull
<T>
Stream<@NonNull T> removeNullsFromStream(Stream<@Nullable T> arg) {
return arg.filter(Objects::nonNull);
}
}
请注意 @SuppressWarnings
的使用,因为 Nullness Checker 是保守的:它会在无法明确证明代码安全时发出警告。通常,filter
的输出与其输入相同;当 filter
的参数是 Objects::nonNull
是一个特例。
special-case 可以 hard-coded 进入 Nullness Checker,这将使 Nullness Checker 更加精确。此行为当前未 special-cased,因此您改用 @SuppressWarnings
。