如何使用lambda,Java在列表的迭代结束时返回值

时间:2018-06-12 07:34:44

标签: list lambda java-8

尝试迭代对象列表以获取迭代中最后一个参数的值。

long lastSeen = 0L;
for(Object o : list) {
    lastSeen = o.getLastSeenId();
}
// will make use of the lastSeen.

我不能用lambda做同样的事,

long lastSeen = 0L;
list.stream().forEach(o-> {
    lastSeen = o.getLastSeenId();
});

因为我将以此编译时结束。

  

在封闭范围内定义的局部变量lastSeenId必须是最终的   或有效的最终

我可以这样做来阅读最大的,但不想:

Set<Long> set = new HashSet<>();
list.stream().forEach(o-> {
    set.add(mergeUser.getLastSeenId());
});

有更好的方法吗? 这样做的原因是监视最后看到的值处理循环(如果发生异常终止)。

4 个答案:

答案 0 :(得分:3)

我没有看到任何理由为什么你需要迭代整个源只是为了检索最后一个id。这可以在没有迭代的情况下完成:

long lastSeen = list.size() > 0? list.get(list.size()-1).getLastSeenId() : 0L;

但是,如果你计划在每次迭代中做一些其他的事情,而不仅仅是前面提到的,那么我会坚持你当前的命令式方法。尝试在这里使用流不是一个合适的选择,也不会为你带来任何好处。

答案 1 :(得分:0)

首先reduce要从Stream获取最后一个元素的元素集。然后使用map从缩小后的最后一个元素中获取所需的值。

final long lastSeenValue = objects.stream()
    .reduce((first, second) -> second)
    .map(LastSeen::getLastSeenId)
    .orElse(null);

但是在我看来,对于你的问题陈述来说,流可能不是更好的选择。在这种情况下,不要犹豫回到命令式方法。

答案 2 :(得分:0)

如果您想继续使用Stream,可以使用AtomicLong来保存 lastSeenValue

final AtomicLong lastSeen = new AtomicLong(0);
list.stream().forEach(o-> {
    lastSeen.set(o.getLastSeenId());
});

答案 3 :(得分:0)

首先,我不会迭代列表以获取最后一个元素。

如果有的话,如果你想流和获取最后一个元素,&#34; one.util.StreamEx&#34;有更好的方法:

StreamEx.of(list)
            .collect(MoreCollectors.last())
            .get();