gpt4 book ai didi

java - 流上的 reduce() 操作似乎正在修改数据源(列表)Stream API Java 8

转载 作者:行者123 更新时间:2023-11-30 06:41:50 25 4
gpt4 key购买 nike

我有一个名为 Transaction 的简单 POJO,它具有三个私有(private)属性 String type、double amount 和 String id。在主类中,我创建了几个调用构造函数的 Transaction 实例,如下所示 -

List<Transaction> transList = Arrays.asList(new Transaction(Transaction.TRANSACTION_TYPE_GROCERY,45.50,"2a"),
new Transaction(Transaction.TRANSACTION_TYPE_GROCERY,50.0,"1a"),
new Transaction(Transaction.TRANSACTION_TYPE_GROCERY,15.00,"3a"),
new Transaction(Transaction.TRANSACTION_TYPE_GROCERY,27.43,"4a"),
new Transaction(Transaction.TRANSACTION_TYPE_CLOTHING,145.0,"5a"),
new Transaction(Transaction.TRANSACTION_TYPE_CLOTHING,105.0,"6a"));

现在我已经使用下面的代码对该列表调用了下面的操作-

Optional<Transaction> totalA = transList.stream()
.filter(x->x.getType()==Transaction.TRANSACTION_TYPE_GROCERY)
.reduce((a,b) -> {Transaction z = b;
z.setAmount(a.getAmount()+b.getAmount());
return z;});

这里我尝试通过将交易作为最低单位来执行缩减操作,并计算所有交易金额的总和并将其设置在一个新的交易 z 中。所有这些最终都存储为可选。此后,如果我尝试对 transList 数据源执行任何其他操作,我会得到不正确的结果,因为 transList 的状态被打乱了。

List<String> transactionIds = transList.stream()
.filter(x -> x.getAmount()>50.00)
.map(Transaction::getId)
.collect(Collectors.toList());
System.out.println(transactionIds);

我已经使用 reduce() 成功地为这个列表完成了包含双项和双返回值的可选实现。我只想知道 Optional 有什么问题,它最终修改了数据源本身,这不应该发生,因为 Stream 是函数式的。

最佳答案

lambda :

(a,b) -> {Transaction z = b;                                                                             
z.setAmount(a.getAmount()+b.getAmount());
return z;}

正在修改b参数。请记住,赋值操作不会复制对象,因此Transaction z = b 只是给b 指向的对象一个别名。

您可能应该使用允许指定身份和组合器的 reduce 重载,os 只是创建对象的副本。

关于java - 流上的 reduce() 操作似乎正在修改数据源(列表)Stream API Java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54588576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com