我使用 CheckerFramework
如何从 Stream 中删除空值并收集 @NonNull 对象?
Stream<@Nullable T> -> (remove nulls) -> Stream<@NonNull T>
我使用 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
与其输入相同;当 is 的参数filter
是Objects::nonNull
特殊情况时。
这种特殊情况可以硬编码到 Nullness Checker 中,这将使 Nullness Checker 更加精确。此行为目前不是特殊情况,因此您可以@SuppressWarnings
改用。