Как извлечь два элемента из Stream по их позициям? Например, я пытаюсь извлечь элементы 0 и 1 (эти числа произвольны!) Из Stream<String>
. Наивный подход заключается в следующем:Соберите определенные элементы из потока
List<String> strings = Arrays.asList("s0", "s1", "s2", "s3", "s4");
Consumer<String> c0 = s -> System.out.println("c0.accept(" + s + ")");
Consumer<String> c1 = s -> System.out.println("c1.accept(" + s + ")");
strings.stream().skip(0).peek(c0).skip(1).peek(c1).findAny();
Это производит следующий вывод:
c0.accept(s0)
c0.accept(s1)
c1.accept(s1)
Я понимаю, что это потому, что s0
будет попадать в поток, сталкиваются skip(0)
, то peek(c0)
(что дает первую строку) а затем skip(1)
, который пропустит этот элемент, а затем, по-видимому, продолжит следующий элемент с начала потока.
Я думал, что я мог бы использовать эти потребители, чтобы извлечь строки, но c0
будут переписаны вторым элементом:
String[] extracted = new String[2];
c0 = s -> extracted[0];
c1 = s -> extracted[1];
EDIT:
Эти характеристики потока:
- Существует только поток, а не список или массив
- Поток возможно бесконечное
- поток может быть sequential
Во-первых, 'skip (0)' ничего не делает, вы можете удалить его. Во-вторых, вам придется объяснить свой вариант использования немного больше, потому что вам лучше избавиться от индекса, используя исходный список, вместо использования потоков. – Andreas
Вы действительно не можете извлекать по индексу из 'Stream', поскольку поток не является« List »- это произвольный _flow_ элементов. Вам нужно будет рассказать нам, что вы пытаетесь сделать, поскольку это очень похоже на [XY Problem] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). –
@Andreas Как я уже сказал, числа являются произвольными, поэтому подумайте о 'skip (pos0)' вместо 'skip (0)' и 'skip (pos1)' для 'skip (1)'. «Исходный список» не существует (как упоминалось). – steffen