我有一个List<B>
结构的对象列表,如下所示:
class B {
int x;
String y;
}
现在,我想查找B对象b的最后一次出现,例如b.x=1
。一世
只需运行一个for循环并更新每个索引就可以做到这一点
比赛。但是我不知道如何在Java 8中做到这一点。
我看到有
适用于findFirst()
和findAny()
的Java 8 API,但未找到任何内容
与查找最后一次出现类似。
答案 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));