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,但无助于防止这种情况。