Esiste un modo conciso per scorrere su uno stream pur avendo accesso all'indice nello stream?
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());
che sembra piuttosto deludente rispetto all'esempio LINQ qui fornito
string[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" };
var nameList = names.Where((c, index) => c.Length <= index + 1).ToList();
C'è un modo più conciso?
Inoltre sembra che la zip sia stata spostata o rimossa ...
IntStream.rangeClosed(x, y)
.
List<String> allCities = map.values().stream().flatMap(list -> list.stream()).collect(Collectors.toList());
zip
stato rimosso, insieme a flussi sperimentali a due valori variamente chiamati BiStream
o MapStream
. Il problema principale è che per farlo efficacemente Java ha davvero bisogno di un tipo di coppia strutturata (o tupla). In mancanza di uno, è facile creare una classe Pair o Tuple generica - è stata fatta molte volte - ma cancellano tutti dello stesso tipo.
intRange()
? Fino ad ora non ho mai incontrato questo metodo in Java 8.