从Stream< @Nullable T>转换流< @NonNull T>使用流api

时间:2017-02-08 07:35:16

标签: java checker-framework

我使用CheckerFramework

如何从Stream中删除空值并获取@NonNull对象的集合?

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

1 个答案:

答案 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代替。