Java8 forEach与索引

时间:2019-12-25 20:52:27

标签: java foreach java-8

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

不幸的是,这不是在Java8中实现的,因此无法实现以下实现:

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

我知道执行此操作的一种简单方法是为每个循环使用索引整数:

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

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

我认为初始化索引整数并为每次迭代增加索引的通用代码应移至方法中。因此,我定义了自己的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++);
    }
}

我可以像这样使用它:

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

我在任何util库(例如guava)中都找不到类似的实现。 所以我有以下问题:

  • 为什么没有一个实用程序可以为我提供此功能?
  • 是否有原因未在Java Iterable.forEach methdod中实现?
  • 我没有找到一个好的工具可以提供此功能吗?

2 个答案:

答案 0 :(得分:4)

如果您想使用proc = subprocess.Popen(t"<path to python>", "<path to your script>"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False) stdout, stderr = proc.communicate() ,可以这样使用forEach

IntStream

答案 1 :(得分:0)

我在Is there a concise way to iterate over a stream with indices in Java 8?这篇帖子中在Eclipse集合中找到了util方法

https://www.eclipse.org/collections/javadoc/7.0.0/org/eclipse/collections/impl/utility/Iterate.html#forEachWithIndex-java.lang.Iterable-org.eclipse.collections.api.block.procedure.primitive.ObjectIntProcedure-

Iterate.forEachWithIndex(people, (Person person, int index) -> LOGGER.info("Index: " + index + " person: " + person.getName()));

https://github.com/eclipse/eclipse-collections/blob/master/eclipse-collections/src/main/java/org/eclipse/collections/impl/utility/internal/IteratorIterate.java的实现与我的util方法非常相似:

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