Есть ли краткий способ перебора потока, имея доступ к индексу в потоке?
String[] names = {"Sam","Pamela", "Dave", "Pascal", "Erik"};
List<String> nameList;
Stream<Integer> indices = intRange(1, names.length).boxed();
nameList = zip(indices, stream(names), SimpleEntry::new)
.filter(e -> e.getValue().length() <= e.getKey())
.map(Entry::getValue)
.collect(toList());
что выглядит довольно обидно по сравнению с приведенным там примером LINQ
string[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" };
var nameList = names.Where((c, index) => c.Length <= index + 1).ToList();
Есть ли более лаконичный способ?
Далее кажется, что почтовый индекс либо сдвинулся, либо был удален ...
IntStream.rangeClosed(x, y)
.
List<String> allCities = map.values().stream().flatMap(list -> list.stream()).collect(Collectors.toList());
zip
был удален наряду с экспериментальными двузначными потоками, называемыми по-разному BiStream
или MapStream
. Основная проблема заключается в том, что для эффективного выполнения Java действительно необходим тип структурной пары (или кортежа). Без него легко создать общий класс Pair или Tuple - это было сделано много раз - но все они стираются до одного и того же типа.
intRange()
? До сих пор не встречал этот метод в Java 8.