如何在具有匹配属性的列表中查找元素的索引

时间:2018-07-17 12:30:03

标签: java java-8

我有一个List<B>结构的对象列表,如下所示:

class B {
    int x;
    String y;
}

现在,我想查找B对象b的最后一次出现,例如b.x=1。一世    只需运行一个for循环并更新每个索引就可以做到这一点    比赛。但是我不知道如何在Java 8中做到这一点。

我看到有    适用于findFirst()findAny()的Java 8 API,但未找到任何内容    与查找最后一次出现类似。

5 个答案:

答案 0 :(得分:2)

 Optional<B> reduce = list.stream()
            .filter(b -> b.x == 1)
            .reduce((a, b) -> b);

这将获取相同的对象(具有相同的x值),并返回列表中的下一个对象。

答案 1 :(得分:2)

使用reduce操作可以做到这一点,首先要保持匹配的元素,然后对每一对(有序的)保持第二个,直到剩下一个并返回

static B getLastBeFromInt(List<B> list, int i){
    return list.stream().filter(b -> b.x==i).reduce((first,second) -> second).orElse(null);
}

答案 2 :(得分:1)

就像基于循环的搜索一样,当您寻找某事物的最后出现时,最有效的解决方案是向后搜索。此外,如果您需要使用Stream API查找索引,则必须首先遍历索引:

OptionalInt pos = IntStream.rangeClosed(1-list.size(), 0).map(i -> -i)
    .filter(ix -> list.get(ix).x == 1)
    .findFirst();

pos.ifPresent(ix -> System.out.println("found "+list.get(ix)+" at "+ix));

答案 3 :(得分:0)

另一个想法是将Stream从最后一个索引运行到第一个索引,并使用Stream::findFirst

Optional<B> lastElement = IntStream.range(0, bs.size())
                                   .mapToObj(i -> bs.get(bs.size() - 1 - i))
                                   .filter(b -> b.x == 1).findFirst();

答案 4 :(得分:0)

查找满足filter中提供的条件的最后一次出现的索引的Java-9版本:

IntStream.iterate(list.size()-1, i -> i >= 0, i -> i - 1)
         .filter(i -> list.get(i).x == 1)
         .findFirst()
         .ifPresent(i -> System.out.println("found "+list.get(i)+" at "+i));