Java8 forEach 带索引

Cod*_*les -1 java foreach java-8

我找不到使用当前对象和当前索引调用 lamda 的 forEach 方法。

不幸的是,这在 java8 中没有实现,所以下面的实现是不可能的:

List<String> list = Arrays.asList("one", "two");
list.forEach((element, index) -> System.out.println(String.format("[%d] : %s", index, element)));
Run Code Online (Sandbox Code Playgroud)

我知道一个简单的方法是使用带有索引整数的 for each 循环:

List<String> list = Arrays.asList("one", "two");

int index = 0;
for (String element : list) {
   System.out.println(String.format("[%d] : %s", index++, element));
}
Run Code Online (Sandbox Code Playgroud)

我认为初始化索引整数并为每次迭代增加它的通用代码应该移到一个方法中。所以我定义了自己的forEach方法:

public static <T> void forEach(@NonNull Iterable<T> iterable, @NonNull ObjIntConsumer<T> consumer) {
    int i = 0;
    for (T t : iterable) {
        consumer.accept(t, i++);
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以像这样使用它:

List<String> list = Arrays.asList("one", "two");
forEach(list, (element, index) -> System.out.println(String.format("[%d] : %s", index, element)));
Run Code Online (Sandbox Code Playgroud)

我无法在任何 util 库(例如番石榴)中找到类似的实现。所以我有以下问题:

  • 为什么没有提供此功能的实用程序?
  • java Iterable.forEachmethdod 中没有实现这有什么原因吗?
  • 有没有我没有找到提供此功能的好实用程序?

YCF*_*F_L 6

如果你想使用forEach你可以IntStream像这样使用:

IntStream.range(0, list.size())
        .forEach(index -> System.out.println(String.format("[%d] : %s", index, list.get(index))));
Run Code Online (Sandbox Code Playgroud)