Czy istnieje zwięzły sposób na iterację w strumieniu, mając jednocześnie dostęp do indeksu w strumieniu?
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());
co wydaje się raczej rozczarowujące w porównaniu do podanego tam przykładu LINQ
string[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" };
var nameList = names.Where((c, index) => c.Length <= index + 1).ToList();
Czy istnieje bardziej zwięzły sposób?
Ponadto wydaje się, że zamek błyskawiczny został przesunięty lub usunięty ...
IntStream.rangeClosed(x, y)
.
List<String> allCities = map.values().stream().flatMap(list -> list.stream()).collect(Collectors.toList());
zip
został usunięty wraz z eksperymentalnymi strumieniami o dwóch wartościach, zwanymi inaczej BiStream
lub MapStream
. Głównym problemem jest to, że aby to zrobić skutecznie, Java naprawdę potrzebuje typu pary (lub krotki) o typie strukturalnym. Brakuje jednego, łatwo jest stworzyć ogólną klasę Pair lub Tuple - robiono to wiele razy - ale wszystkie usuwają się do tego samego typu.
intRange()
? Do tej pory nie spotkałem się z tą metodą w Javie 8.