Во время учебника о новом API потока JDK8 я столкнулся с статическим методом .empty()
от IntStream
, DoubleStream
и LongStream
.Какова цель метода IntStream.empty()?
Итак, когда имеет смысл использовать эти методы?
Во время учебника о новом API потока JDK8 я столкнулся с статическим методом .empty()
от IntStream
, DoubleStream
и LongStream
.Какова цель метода IntStream.empty()?
Итак, когда имеет смысл использовать эти методы?
Вы можете использовать для инициализации пустого потока любого из перечисленных вами типов. Я рассматриваю это как другой способ, как построить новый объект. Просто как тот.
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#empty--
Хорошим примером является создание IntStream
от OptionalInt
вы хотите одноэлементный поток, если опция присутствует и пустой поток, если опция отсутствует:
public static IntStream ofOptional(OptionalInt optional) {
return optional.isPresent() ? IntStream.of(optional.get()) : IntStream.empty();
}
На самом деле такие метод уже added JDK9.
(Вы спросили о empty()
метода на IntStream
, LongStream
и DoubleStream
, но этот метод также на интерфейсе Stream
для ссылочных типов.)
Общий ответ в том, что empty()
полезен в качестве источника потока для передачи в API, который принимает поток - либо в качестве аргумента, либо как возвращаемое значение, - и когда у вас нет значений для передачи. В большинстве случаев вы не можете пройти null
, вам нужно передать какой-то поток. Способ получения потока, который не имеет значений, заключается в использовании Stream.empty()
и друзей.
Вот пример, который повторяется четные числа и нечетные числа капель и собирает их в список:
List<Integer> list =
IntStream.range(0, 10)
.flatMap(i -> (i & 1) == 0 ? IntStream.of(i, i) : IntStream.empty())
.boxed()
.collect(Collectors.toList());
В результате
[0, 0, 2, 2, 4, 4, 6, 6, 8, 8]
как можно было бы ожидать. Главное, что flatMap()
проходит в одном значении и ожидает получить произвольное количество значений, включая нулевые значения. То, как это делается, заключается в том, чтобы операция плоского сопоставления возвращала поток значений. Чтобы вернуть нулевые значения, он возвращает пустой поток.
Обратите внимание, что в целом вы говорите, что «в большинстве случаев вы не можете передать« null », в частном случае« flatMap »вы можете передать null. –
@TagirValeev Drat, вы испортили мой пример. :-) Null действительно работает, но мне кажется гораздо яснее вернуть пустой поток. –