如何在java 8中获取findFirst()的索引?

2022-09-03 12:41:22

我有以下代码:

ArrayList <String> entries = new ArrayList <String>();

entries.add("0");
entries.add("1");
entries.add("2");
entries.add("3");

String firstNotHiddenItem = entries.stream()
                    .filter(e -> e.equals("2"))
                    .findFirst()
                    .get();

我需要知道第一个返回的元素的索引是什么,因为我需要在条目中编辑它 。据我所知,返回元素的值,而不是引用。我应该只使用ArrayListget()

int indexOf(Object o)

相反?


答案 1

您可以使用类似如下的方式获取元素的索引:IntStream

int index = IntStream.range(0, entries.size())
                     .filter(i -> "2".equals(entries.get(i)))
                     .findFirst().orElse(-1);

但是你应该使用首选方法,因为它更简洁,更具表现力,并且计算相同的结果。List::indexOf


答案 2

您不能以直接的方式流式传输流程元素,而无需了解它们在流中的位置的上下文。

但是,如果您准备脱下手套...

int[] position = {-1};

String firstNotHiddenItem = entries.stream()
        .peek(x -> position[0]++)  // increment every element encounter
        .filter("2"::equals)
        .findFirst()
        .get();

System.out.println(position[0]); // 2

使用 an 而不是简单 ,是为了规避“有效最终”的要求;对数组的引用常量,只有其内容会发生变化。int[]int

还要注意使用方法引用而不是lambda,这不仅避免了可能的NPE(如果流元素是),更重要的是看起来更酷。"2"::equalse -> e.equals("2")null


一个更可口(不那么黑客化)的版本:

AtomicInteger position = new AtomicInteger(-1);

String firstNotHiddenItem = entries.stream()
        .peek(x -> position.incrementAndGet())  // increment every element encounter
        .filter("2"::equals)
        .findFirst()
        .get();

position.get(); // 2

推荐