使用 vavr 中的索引遍历列表

Iterate over list with indices in vavr

我正在使用 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 中实现此目的?

如果要访问索引,只需使用普通的 for 循环和 List.get(ix)

Vavr 有一个类似于 Scala 的 API。 Vavr 集合(又名 traversables)有一个名为 zipWithIndex() 的方法。它 returns 一个新集合,由元素和索引的元组组成。

此外,使用迭代器为我们节省了新的集合实例。

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 个实例。

更新: 我只是 added forEachWithIndex 到 Vavr。它将包含在下一个版本中。

免责声明:我是 Vavr 的创建者。

JMPL 是简单的 java 库,它可以模拟一些特征模式匹配,使用 Java 8 个特征。 这个库也支持简单的遍历集合。

   Figure figure = new Rectangle();    

   foreach(listRectangles, (int w, int h) -> {
      System.out.println("square: " + (w * h));
   });