【发布时间】:2017-03-27 12:44:19
【问题描述】:
是否有一种简洁的方法可以在访问流中的索引的同时迭代流?
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();
有没有更简洁的方法?
此外,似乎 zip 已移动或已被删除...
【问题讨论】:
-
什么是
intRange()?直到现在还没有在 Java 8 中遇到过这种方法。 -
@RohitJain 可能是
IntStream.rangeClosed(x, y)。 -
作为旁注,
List<String> allCities = map.values().stream().flatMap(list -> list.stream()).collect(Collectors.toList());的挑战 4 看起来更好(IMO) -
是的,
zip已被删除,还有实验性的二值流(称为BiStream或MapStream)。主要问题是,为了有效地做到这一点,Java 确实需要一个结构类型的对(或元组)类型。缺少一个,创建一个通用的 Pair 或 Tuple 类很容易——已经做过很多次了——但它们都擦除为相同的类型。 -
哦,泛型 Pair 或 Tuple 类的另一个问题是它需要对所有原语进行装箱。
标签: java java-8 java-stream