У меня есть простой POJO под названием Транзакция с тремя частными свойствами: тип String, удвоенная сумма и идентификатор String.В основном классе я создал несколько экземпляров 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);
Я выполнил опциональный элемент Double, содержащий двойной возвратреализации значений успешно для этого списка с помощью Redu ().Все, что я хочу знать, это то, что не так с Optional, что он в конечном итоге изменяет сам источник данных, что не должно происходить, так как Stream работает.