如何在Java 8中访问流的元素,或返回流的一个元素?

时间:2015-02-16 22:28:34

标签: java lambda functional-programming java-8 java-stream

我有方法:

public Monitor getCurrentMonitor() {
    findCurrentMonitor();
    return monitors.stream().filter(a -> a.isCurrent());
}

它的目的是找到当前的Monitor(列表中只有一个),然后返回它。我将如何在功能上实现这一目标,或者在程序上做得更好?

1 个答案:

答案 0 :(得分:2)

您可以调用findFirst(),它将返回Optional<Monitor>,然后您只返回此Optional实例中的值,或者如果它为空(如你说列表中有一个当前的监视器):

public Monitor getCurrentMonitor() {
    return monitors.stream()
                   .filter(a -> a.isCurrent())
                   .findFirst()
                   .orElseThrow(() -> new NoCurrentMonitorException());
}

orElseThrow部分是为了防止在空get上调用Optional(在这种情况下抛出自定义异常可能会更好,以使目标明确没有当前监视列表中的实例)。

<小时/> 我不确定你findCurrentMonitor();在做什么。我想你应该删除它,因为流上的过滤基本上是它的作用;即找到当前的监视器。从纯粹的功能方面来看,你不应该调用这个函数(findCurrentMonitor();),因为它有副作用。