Конвертировать из Stream<@Nullable T> в Stream<@NonNull T>, используя потоковый API

Я использую CheckerFramework

Как я мог удалить нули из Stream и получить коллекцию объектов @NonNull?

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

1 ответ

Решение

Вот код, который делает это.

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 это особый случай.

Этот особый случай мог бы быть жестко запрограммирован в Проверке Нульности, и это сделало бы Проверку Нульности более точной. Это поведение в настоящее время не имеет специального случая, поэтому вы используете @SuppressWarnings вместо.

Другие вопросы по тегам