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

Java 如何在具有匹配属性的列表中查找元素的索引,java,java-8,Java,Java 8,我有一个对象列表,结构如下: class B { int x; String y; } 现在我想找到B对象B的最后一个匹配项,使得B.x=1。我 只需运行for循环并更新每个循环的索引就可以做到这一点 火柴但是如何在Java8中做到这一点,我不知道 我看到有 用于findFirst()和findAny()的Java 8 API,但未找到任何内容 类似于查找最后一个事件 Optional reduce=list.stream() Optional<B> reduce

我有一个对象列表,结构如下:

class B {
    int x;
    String y;
}
现在我想找到B对象B的最后一个匹配项,使得
B.x=1
。我 只需运行for循环并更新每个循环的索引就可以做到这一点 火柴但是如何在Java8中做到这一点,我不知道

我看到有 用于
findFirst()
findAny()
的Java 8 API,但未找到任何内容 类似于查找最后一个事件

Optional reduce=list.stream()
 Optional<B> reduce = list.stream()
            .filter(b -> b.x == 1)
            .reduce((a, b) -> b);
.filter(b->b.x==1) .减少((a,b)->b);
这将获取相同的对象(具有相同的值x)并返回列表中的下一个对象。

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

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

使用
reduce
操作可以实现它,首先保持匹配的元素,然后对于每对(有序)保留第二个对象,直到剩下一个并返回它

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


使用
reduce
操作,您可以实现它,首先保留匹配的元素,然后对每对(有序)保留第二个元素,直到剩下一个,然后返回它

static B getLastBeFromInt(List<B> list, int i){
    return list.stream().filter(b -> b.x==i).reduce((first,second) -> second).orElse(null);
}
static B getLastBeFromInt(列表,int i){
return list.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();
Optional lastElement=IntStream.range(0,bs.size())
.mapToObj(i->bs.get(bs.size()-1-i))
.filter(b->b.x==1).findFirst();

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

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

就像基于循环的搜索一样,当您在查找某件事情的最后一次出现时,最有效的解决方案是向后搜索。此外,如果需要使用流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));

就像基于循环的搜索一样,当您查找某个事件的最后一次出现时,最有效的解决方案是向后搜索。此外,如果需要使用流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));

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));

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));

被骗看起来不错,但这个问题似乎是问上一场比赛的指数@OP你真的需要索引还是只需要最后一个匹配的元素?dupe看起来不错,但这个问题似乎要求最后一个匹配的索引@OP你真的需要索引还是只需要最后一个匹配元素?最好返回
Optional
,让此方法的用户决定在“无值”情况下要做什么。@Aominè将使用此代码的人是“用户”,他会看到他想要做什么。API的每个用户都不能修改正在使用的代码。我不是说代码的作者。无论如何,您建议在没有值的情况下返回
null
,这不尽可能地利用
可选类型。Optional存在的主要原因是帮助防止NullPointerException,而您的代码使用Optional,但无助于防止。最好返回
Optional
,让此方法的用户决定在“无值”情况下要做什么。@Aominè将使用此代码的是“用户”,他将看到他想要做的事情——API的每个用户都不能修改正在使用的代码。我不是说代码的作者。无论如何,您建议在没有值的情况下返回
null
,这不尽可能地利用
可选类型。Optional存在的主要原因是帮助防止NullPointerException,而您的代码使用Optional,但无助于防止这种情况。