2015-07-27 5 views

ответ

7

Хорошим примером является создание IntStream от OptionalInt вы хотите одноэлементный поток, если опция присутствует и пустой поток, если опция отсутствует:

public static IntStream ofOptional(OptionalInt optional) { 
    return optional.isPresent() ? IntStream.of(optional.get()) : IntStream.empty(); 
} 

На самом деле такие метод уже added JDK9.

4

(Вы спросили о 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() проходит в одном значении и ожидает получить произвольное количество значений, включая нулевые значения. То, как это делается, заключается в том, чтобы операция плоского сопоставления возвращала поток значений. Чтобы вернуть нулевые значения, он возвращает пустой поток.

+0

Обратите внимание, что в целом вы говорите, что «в большинстве случаев вы не можете передать« null », в частном случае« flatMap »вы можете передать null. –

+0

@TagirValeev Drat, вы испортили мой пример. :-) Null действительно работает, но мне кажется гораздо яснее вернуть пустой поток. –

Смежные вопросы