gpt4 book ai didi

java - 使用 Java 8 获取列表的最后一个非空元素

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:15:13 24 4
gpt4 key购买 nike

在 Java 7 中,如果我想获取列表的最后一个非空元素,我会这样写:

public CustomObject getLastObject(List<CustomObject> list) {
for (int index = list.size() - 1; index > 0; index--) {
if (list.get(index) != null) {
return list.get(index);
}
}
// handling of case when all elements are null
// or list is empty
...
}

我想使用 lambda 表达式或 Java 8 的其他功能编写更短的代码。例如,如果我想获取第一个非空元素,我可以这样写:

public void someMethod(List<CustomObject> list) {
.....
CustomObject object = getFirstObject(list).orElseGet(/*handle this case*/);
.....
}

public Optional<CustomObject> getFirstObject(List<CustomObject> list) {
return list.stream().filter(object -> object != null).findFirst();
}

也许有人知道如何解决这个问题?

最佳答案

一个可能的解决方案是以相反的顺序遍历列表并保留第一个非空元素:

public Optional<CustomObject> getLastObject(List<CustomObject> list) {
return IntStream.range(0, list.size()).mapToObj(i -> list.get(list.size() - i - 1))
.filter(Objects::nonNull)
.findFirst();
}

请注意,Stream API 中没有 findLast 方法,因为 Stream 不一定是有序的或有限的。

另一种解决方案是遍历列表并通过仅保留当前元素来减少它。这有效地将流减少到最后一个元素。

public Optional<CustomObject> getLastObject(List<CustomObject> list) {
return list.stream().filter(Objects::nonNull).reduce((a, b) -> b);
}

关于java - 使用 Java 8 获取列表的最后一个非空元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32652479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com