减少()上流操作似乎被修改数据(列表)流API的源的Java 8

问题描述 投票:2回答:3

我有三个私人物业字符串类型,双量和字符型一个简单的POJO叫做交易。在主类中,我创建的事务调用构造函数下面写的几个例子 -

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"));

现在,我已经叫下面的下面的代码此listusing操作 -

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;});

在这里,我试图通过保持交易的最低单位进行还原操作和计算的全部交易额的总和,并设置一个新的事务ž内。所有这一切都存储作为最后选项。在此之后,如果我尝试开展transList数据源上的任何其他操作,我得到不正确的结果为transList的状态被打乱。

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

我已经做了包含可选的双项并双击返回值成功实现此列表使用减少()。所有我想知道的是什么是错与它最终修改数据本身的来源,这不应该发生,因为流功能是可选的。

java java-8 java-stream pass-by-reference reduce
3个回答
3
投票

拉姆达:

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

在修改b参数。请记住,所以Transaction z = b只是给一个别名对象通过b指向一个assignement不会复制的对象。

你或许应该使用reduce重载允许指定的身份和组合,操作系统只需要创建一个对象的副本。


1
投票
Transaction z = b;// doesn't create a new object.  
                                                    z.setAmount(a.getAmount()+b.getAmount()); //you actually set a amout to `b` object

return z; // and here you returm `b` object 

0
投票

这一切就OK了与可选。您的对象是一个参考的数据类型。在这里,你复制你的对象Transaction z = b;的参考。它不创建一个新的。现在,这两个变量指向同一Transaction。而且不管你修改zb它最终修改源数据

这可能是有用的https://javarevisited.blogspot.com/2015/09/difference-between-primitive-and-reference-variable-java.html

© www.soinside.com 2019 - 2024. All rights reserved.