【问题标题】:How can I get the index of item inside the Java streams? [duplicate]如何获取 Java 流中的项目索引? [复制]
【发布时间】:2020-06-26 16:37:39
【问题描述】:

我有一个代码如下:

Arrays.stream(myArray).forEach(item -> System.out.println(item));

Java 中的流是否有能力获取我可以在 lambda 表达式中使用它们的当前项的索引?

例如,在 JavaScript 中,我们有这样的代码可以为我们提供索引:

myArray.forEach((index, item) => console.log(`${index} ${item}`));

我们在 Java 中有什么等价物吗?

【问题讨论】:

标签: java arrays lambda java-stream indexof


【解决方案1】:

是的,回答您的问题,在 Java 中,您可以使用索引遍历流。

这是一个非常简单的基本代码,展示了如何获取索引:

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {

        String[] array = { "Goat", "Cat", "Dog", "Crow", "Snake" }; 
        
        IntStream.range(0, array.length)
                 .mapToObj(index -> String.format("%d -> %s", index, array[index]))
                 .forEach(System.out::println); 
                 
    }
    
}

输出:

0 -> Goat                                                                                                                                                  
1 -> Cat                                                                                                                                                   
2 -> Dog                                                                                                                                                   
3 -> Crow                                                                                                                                                  
4 -> Snake

【讨论】:

    【解决方案2】:

    你可以这样做:

    Arrays.stream(array).forEach(item -> 
            System.out.println(item + " " + Arrays.asList(array).indexOf(item)));
    

    更新

    如果您有重复的项目,一种选择是使用 AtomicInteger:

    AtomicInteger index = new AtomicInteger(0);
    Arrays.stream(array).forEach(item -> 
        System.out.println(item + " " + index.getAndIncrement()));
    

    如果你被允许使用 Guava,你可以这样做:

    Streams.mapWithIndex(Arrays.stream(array),
            (item, index) -> item + " " + index)
            .forEach(System.out::println);
    

    【讨论】:

    • 如果数组中有重复项会怎样?
    • @Federico klez Culloca,来自 List javadoc:返回满足 Objects.equals(o, get(i)) 的最低索引 i
    • 让我重新表述一下:当有重复时,您的代码会发生什么?我试图指出您的代码没有考虑到这一点,并且会以不连贯的方式运行(即,您有时会得到错误的索引)。
    • @Federico klez Culloca,如果您有重复的项目,一种选择是使用 AtomicInteger。我更新了答案以包含该替代方案。
    • @Federico klez Culloca,如果你允许使用 Guava,你可以Streams.mapWithIndex。查看答案更新。
    猜你喜欢
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2014-01-10
    • 1970-01-01
    • 2019-01-25
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多