让我们假设我有一个这样的类:
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
,所以我应该为此创建一个特定的比较器?
你不需要一个特定的比较器。比较器不是你的问题。
流畅的调用风格很好、时髦,但它有一个许多人似乎忽视的主要缺点:当函数调用序列中的某个地方发生错误时,你不知道它发生在哪里。
因此,为了解决此类问题,最好将流畅的火车分解成单独的货车。(至少对于故障排除,如果你想的话,把它放回火车后,所有的故障排除都完成了。)
在这种情况下,您将看到max()
返回一个可选
因此,您需要提供
ArrayList
为空的情况。可以在调用stream()之前执行此操作。max()
,或者您可以按照Peter Lawrey的建议,通过调用可选
的isPresent()
方法来实现。
顺便说一句,你犯下这个错误的事实表明:
>
您正在使用一些过时的构建工具,这些工具无法对您的代码发出警告,或者
您没有启用所有警告,或者
你收到警告,但你忽略了它们。
不要这样做,这样你永远不会走得太远。我的IntelliJ IDEA在您的代码上给我一个警告(JetBrains称之为“检查”),说
. get()
是在没有. isPresent()
的情况下调用的。因此,我可以在编译代码之前、运行代码之前、故障排除之前以及询问stackoverflow问题之前立即判断代码的问题。
我要做的是检查可选的
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搜索包含列表列表的元素,其中列表中至少有一个项目与搜索参数匹配。 这是我目前拥有的结构的一个例子。 我想搜索数据列表中值为“绿色”的所有项目。 我目前有这个: 但是,不会返回任何结果。