Existe uma maneira concisa de iterar em um fluxo enquanto tiver acesso ao índice no fluxo?
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());
o que parece bastante decepcionante em comparação com o exemplo LINQ dado lá
string[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" };
var nameList = names.Where((c, index) => c.Length <= index + 1).ToList();
Existe uma maneira mais concisa?
Além disso, parece que o zip foi movido ou removido ...
IntStream.rangeClosed(x, y)
.
List<String> allCities = map.values().stream().flatMap(list -> list.stream()).collect(Collectors.toList());
zip
foi removido, juntamente com fluxos experimentais de dois valores, chamados de BiStream
ou MapStream
. O principal problema é que, para fazer isso efetivamente, o Java realmente precisa de um tipo de par (ou tupla) de tipo estrutural. Na falta de uma, é fácil criar uma classe par ou tupla genérica - isso já foi feito várias vezes - mas todas elas são apagadas para o mesmo tipo.
intRange()
? Até agora, não encontramos esse método no Java 8.