0

我使用 CheckerFramework

如何从 Stream 中删除空值并收集 @NonNull 对象?

Stream<@Nullable T> -> (remove nulls) -> Stream<@NonNull T>
4

1 回答 1

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与其输入相同;当 is 的参数filterObjects::nonNull特殊情况时。

这种特殊情况可以硬编码到 Nullness Checker 中,这将使 Nullness Checker 更加精确。此行为目前不是特殊情况,因此您可以@SuppressWarnings改用。

于 2017-02-08T18:02:21.363 回答