【问题标题】:How to access elements of a stream in Java 8, or return one element of a stream?如何在 Java 8 中访问流的元素,或返回流的一个元素?
【发布时间】:2015-02-16 22:28:33
【问题描述】:

我有方法:

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

它的目的是找到当前的Monitor(列表中只有一个),并返回它。我将如何在功能上实现这一点,还是在程序上实现它会更好?

【问题讨论】:

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


    【解决方案1】:

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

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

    orElseThrow 部分是为了防止在空的Optional 上调用get(在这种情况下,最好抛出您的自定义异常以明确表明列表中没有当前监视器实例) .


    我不确定您的 findCurrentMonitor(); 在做什么。我想您应该将其删除,因为对流的过滤基本上就是它的作用;即找到当前的监视器。从纯粹的功能方面来看,您不应该调用此函数 (findCurrentMonitor();),因为它有副作用。

    【讨论】:

    • @Connorelsea 只是一个可能包含值的容器。您可能需要查看documentation
    • @Connorelsea 好吧,对于纯粹的功能方式,您不应该有修改数据的功能。即,您的方法不应该有副作用(因此没有 void 返回类型)。他们应该只通过接受参数和返回结果来与外部环境“交流”(想想 Java 的 String 类)。所以严格来说你的 findCurrentMonitor 函数,它应该返回一个新的 List ,每个元素都将通过复制构造函数创建,并在其上设置它们的 current 属性;这样原始数据就不会发生变异。
    • @Connorelsea 不,Java 不是一种函数式语言,因此处理这种“副作用”属性更难,因为你会使用函数式语言(例如 Scala)。如果你明白了主要思想;很好,但正如你所说,以功能方式实现它会更难(并非不可能)。
    • @Connorelsea 在某些情况下,过程循环比使用 Stream API 及其所有工具更方便。不,使用功能概念并没有错;甚至有时您必须以程序方式编写一些 Scala 代码(尽管除非您真的别无选择,否则建议您这样做)。真的,我会说这取决于您面临的用例。正如我所说,即使 Java 8 中有全新的特性,它仍然是一种过程语言。
    • 不过,混合方法可能会导致笨拙或错误的代码,例如在流上运行的 lambda 的变异状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2023-03-19
    • 2016-07-06
    相关资源
    最近更新 更多