我使用CheckerFramework
如何从Stream中删除空值并获取@NonNull对象的集合?
Stream<@Nullable T> -> (remove nulls) -> Stream<@NonNull T>
答案 0 :(得分:2)
这是执行此操作的代码。
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
时,这是一个特例。
这种特殊情况可以硬编码到Nullness Checker中,这样可以使Nullness Checker更精确。此行为目前不是特殊情况,因此您使用@SuppressWarnings
代替。