当前位置: 首页 > 知识库问答 >
问题:

避免NoSuchElementExcema在Java8流

慕容坚
2023-03-14

此问题是之前问题的后续:使用Streams添加BigDecimals

这个问题与使用Java8Stream和Lambda表达式添加BigDecimal有关。在实现给出的答案后,我遇到了另一个问题:每当流为空时,可选::get()方法都会抛出一个NoSuchElementExc0019

考虑下面的代码:

public static void main(String[] args){
    LinkedList<BigDecimal> values = new LinkedList<>();
//        values.add(BigDecimal.valueOf(.1));
//        values.add(BigDecimal.valueOf(1.1));
//        values.add(BigDecimal.valueOf(2.1));
//        values.add(BigDecimal.valueOf(.1));

    // Classical Java approach
    BigDecimal sum = BigDecimal.ZERO;
    for(BigDecimal value : values) {
        System.out.println(value);
        sum = sum.add(value);
    }
    System.out.println("Sum = " + sum);

    // Java 8 approach
    values.forEach((value) -> System.out.println(value));
    System.out.println("Sum = " + values.stream().reduce((x, y) -> x.add(y)).get());
}

香草Java代码对空集合没有问题,但是新的Java8代码有问题。

在这里避免NSEE最优雅的方式是什么?当然,我们可以做到:

System.out.println("Sum = " + values == null || values.isEmpty() ? 0 : values.stream().reduce((x, y) -> x.add(y)).get());

但是有没有一种Java的方法来处理空集合?

共有2个答案

司徒俊雄
2023-03-14

在键入示例以提问时,我找到了答案:

Stream::reduce()返回一个可选的,它有一个方法:orElse()。所以

System.out.println("Sum = " + values.stream().reduce((x, y) -> x.add(y)).get());

变成

System.out.println("Sum = " + values.stream().reduce((x, y) -> x.add(y)).orElse(BigDecimal.ZERO));

所以我决定发布一个问答。

兰姆达斯很棒。1爪哇。

程仲卿
2023-03-14

在这种情况下,您不应该使用可返回可选值的reduce版本

您应该使用另一个版本,如前所述,在流为空的情况下提供标识元素,这就是标识元素存在的全部原因。

所以你想要:

System.out.println("Sum = " + values.stream().reduce(BigDecimal.ZERO, (x, y) -> x.add(y));

而不是旧版本。

在这种情况下,您不关心流是否为空,只需要一个有效的结果。

 类似资料:
  • 问题内容: 建议在HTML页面中使用表格(现在已经有了CSS)? 表格有什么用途?表具有哪些CSS所没有的功能? 问题答案: 一点都不。但是将表格用于表格数据。只是不要将它们用于一般布局。 但是,如果您显示表格数据(例如结果或什至是表格),请继续使用表格!

  • 我不断遇到需要通过映射或集合保存状态的解决方案。e、 g.创建一个返回在输入中找到的重复项的方法 我的Java8流解决方案,不幸的是,我正在使用哈希集进行过滤。我理解这并不“恰当”,因为这取决于州。没有州是建议还是硬性规定?这只是运行并行流时的问题吗?有人能推荐一种不使用哈希集的方法吗?

  • 问题内容: 我有3个基于Acivity的应用程序,它的工作流程是 和。当onResume事件触发时,需要调用MainActivity。无需参加其他两项活动。 onResume事件触发时有什么方法可以调用? 谢谢 问题答案: 您可以在AndroidManifest.xml文件中为MainActivity 设置属性。请参阅此处以查找原因和更多详细信息。我认为这是满足您需求的最便捷方法。 编辑: 我刚刚

  • 主要内容:示例资源分配图是系统状态的图形表示。 顾名思义,资源分配图是关于持有一些资源或等待某些资源的所有进程的完整信息。 它还包含有关所有资源的所有实例的信息,无论这些资源是否可用或正在被进程使用。 在资源分配图中,进程由圆形表示,而资源由矩形表示。 我们来详细看看顶点和边的类型。 顶点主要有两种类型,资源和过程。 它们中的每一个将以不同的形状表示。 Circle代表进程,而矩形代表资源。 一个资源可以有多个

  • 在避免死锁的情况下,如果系统的结果状态不会导致系统中的死锁,那么将会授予对任何资源的请求。系统的状态将持续检查安全和不安全的状态。 为了避免死锁,进程必须告诉OS,进程可以请求完成其执行的最大资源数量。 最简单和最有用的方法指出,流程应声明它可能需要的每种类型的最大资源数量。 死锁避免算法检查资源分配,以便永远不会有循环等待条件。 安全和不安全的状态 系统的资源分配状态可以由可用资源和已分配资源的

  • 本文向大家介绍利用Java8 Optional如何避免空指针异常详解,包括了利用Java8 Optional如何避免空指针异常详解的使用技巧和注意事项,需要的朋友参考一下 前言 空指针是我们最常见也最讨厌的异常,为了防止空指针异常,你不得在代码里写大量的非空判断。 Java 8引入了一个新的Optional类。用于避免空指针的出现,也无需在写大量的if(obj!=null)这样的判断了,前提是你得