Конвертировать из 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
вместо.