Чи є стислий спосіб перебрати потік під час доступу до індексу в потоці?
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 справді потрібен структурний тип (або кортеж) типу. Не вистачаючи цього, легко створити загальний клас «Пара» або «Tuple» - це було зроблено багато разів, але всі вони стираються до одного типу.
intRange()
? Досі не натрапив на цей метод у Java 8.