¿Hay una manera concisa de iterar sobre una secuencia mientras se tiene acceso al índice en la secuencia?
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());
lo que parece bastante decepcionante en comparación con el ejemplo LINQ dado allí
string[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" };
var nameList = names.Where((c, index) => c.Length <= index + 1).ToList();
¿Hay una manera más concisa?
Además, parece que la cremallera se ha movido o se ha eliminado ...
IntStream.rangeClosed(x, y)
.
List<String> allCities = map.values().stream().flatMap(list -> list.stream()).collect(Collectors.toList());
zip
se eliminó, junto con secuencias experimentales de dos valores denominadas de forma diferente BiStream
o MapStream
. El principal problema es que para hacer esto efectivamente, Java realmente necesita un tipo de par (o tupla) estructuralmente tipado. A falta de uno, es fácil crear una clase genérica de pares o tuplas, se ha hecho muchas veces, pero todas se borran del mismo tipo.
intRange()
? No he encontrado este método en Java 8 hasta ahora.