我使用的是来自vavr库的集合。我有一个定义如下的元素列表:
List<Integer> integers = List.of(1, 2, 3);
如何迭代列表中的元素并同时访问索引?Groovy中有一个方法eachWithIndex
。我正在vavr
中寻找类似的东西。我想这样使用它:
integers.eachWithIndex((int element, int index) -> {
System.out.println("index = " + index + " element = " + element);
})
如何在vavr
中实现这一点?
Vavr有一个类似Scala的API。Vavr集合(又称可遍历集合(有一个名为zipWithIndex()
的方法。它返回一个新的集合,该集合由元素和索引的元组组成。
此外,使用迭代器可以为我们保存新的集合实例。
final List<Integer> integers = List.of(1, 2, 3);
integers.iterator().zipWithIndex().forEach(t ->
System.out.println("index = " + t._1 + " element = " + t._2)
);
然而,我发现创建一个新的集合不如Kotlin解决方案有效,尤其是当所有信息(元素和索引(都已经到位时。我喜欢在Vavr的集合中添加一个新方法forEachWithIndex
的想法,它的作用就像在Kotlin中一样
更新:我们可以将forEachWithIndex(ObjIntConsumer<? super T>)
添加到Vavr的Traversable
中。它不仅仅是iterator().zipWithIndex().forEach(Consumer<Tuple2<T, Integer>>)
的快捷方式,因为它在迭代过程中不会创建Tuple2
实例。
更新:我刚刚在Vavr中添加了forEachWithIndex。它将包含在下一个版本中。
免责声明:我是Vavr的创建者
如果您想访问索引,只需对循环和List.get(ix)
使用normal即可。
JMPL是一个简单的java库,它可以使用java 8特性来模拟一些特性模式匹配。这个库还支持简单的迭代集合。
Figure figure = new Rectangle();
foreach(listRectangles, (int w, int h) -> {
System.out.println("square: " + (w * h));
});