使用流 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