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

使用java 8在BigDecimal列表中查找max

秦宁
2023-03-14

让我们假设我有一个这样的类:

public class A {
    private int id;
    private BigDecimal amount;
}

我有一个列表

这种方法:

List<A> brol = new ArrayList<>();
BigDecimal max = brol.stream().max(Comparator.comparing(A -> A.getAmount())).get().getAmount();
        System.out.println("MAX = " + max);

给出了NoTouchElementException,所以我应该为此创建一个特定的比较器?


共有2个答案

江鹏飞
2023-03-14

你不需要一个特定的比较器。比较器不是你的问题。

流畅的调用风格很好、时髦,但它有一个许多人似乎忽视的主要缺点:当函数调用序列中的某个地方发生错误时,你不知道它发生在哪里。

因此,为了解决此类问题,最好将流畅的火车分解成单独的货车。(至少对于故障排除,如果你想的话,把它放回火车后,所有的故障排除都完成了。)

在这种情况下,您将看到max()返回一个可选

因此,您需要提供ArrayList为空的情况。可以在调用stream()之前执行此操作。max(),或者您可以按照Peter Lawrey的建议,通过调用可选isPresent()方法来实现。

顺便说一句,你犯下这个错误的事实表明:

>

  • 您正在使用一些过时的构建工具,这些工具无法对您的代码发出警告,或者

    您没有启用所有警告,或者

    你收到警告,但你忽略了它们。

    不要这样做,这样你永远不会走得太远。我的IntelliJ IDEA在您的代码上给我一个警告(JetBrains称之为“检查”),说. get()是在没有. isPresent()的情况下调用的。因此,我可以在编译代码之前、运行代码之前、故障排除之前以及询问stackoverflow问题之前立即判断代码的问题。

  • 晁璞
    2023-03-14

    我要做的是检查可选的

    Optional<BigDecimal> max = brol.stream()
                                   .map(a -> a.amount)
                                   .max(Comparator.naturalOrder());
    if (max.isPresent()) {
       // have a max
    }
    

    而不是比较器。naturalOrder(),如果您觉得这更清楚,可以使用BigDecimal::compare

    Optional.get()正在抛出NoSuchElementException,因为没有元素。当获得最大值的对象不是可比较的时,您只需要提供比较器

    在这种情况下,您不需要最大A,只需要最大,它是BigDecimal,它是可比

    如果你真的想要最小值,你可以提供一个比较器,尽管在这方面使用min()是一个更简单的选择。

     类似资料:
    • 我有以下几门课: 我有一个物品清单。我想遍历列表并找到具有特定ID的实例。我试着通过溪流来做。

    • 假设我有一个包含元素的列表。 使用Java8 streams,如何找到列表最小元素的索引(例如,在本例中为1)?

    • 我有一个实体: 内在类 我需要的是内部ID列表。为了解决这个问题,我尝试了这样的方法:- List innerEnityIds=listofenity.stream().map(sys->sys.getdata().stream().map(obj->obj.getid().collect(collectors.tolist()));

    • 我正在尝试编写一个方法,该方法可以在列表列表中找到对象的索引并利用并行性。这是我的代码。 当我运行以下代码时 输出类似于 换句话说,即使在找到对象之后,搜索仍在继续。不应该是短路操作吗?我错过了什么?此外,在迭代列表或锯齿数组时,利用并行性的最佳方法是什么? 编辑 按照@Sotirios回答中的想法,我得到了以下输出 请注意 即使找到答案也继续搜索。

    • 我正在使用MongoDB搜索包含列表列表的元素,其中列表中至少有一个项目与搜索参数匹配。 这是我目前拥有的结构的一个例子。 我想搜索数据列表中值为“绿色”的所有项目。 我目前有这个: 但是,不会返回任何结果。