reducir () operación en corriente parece ser la modificación de la fuente de datos (lista) Stream API de Java 8

PeeCee:

Tengo una sencilla llamada POJO Transacción con tres propiedades privadas tipo String, doble cantidad y la cadena ID. En la clase principal, creé pocos casos de transacciones llamando al constructor como está escrito abajo -

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

Ahora he llamado por debajo de operación en esta listusing debajo de código -

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

Aquí he tratado de realizar la operación de reducción, manteniendo la transacción como la unidad más baja y calcular la suma de todas las cantidades de transacción y la puso dentro de una nueva transacción z. Todo esto se almacena finalmente como opcional. Después de esto, si trato de llevar a cabo cualquier otra operación en la fuente de datos transList, consigo resultados incorrectos como el estado de transList se interrumpieron.

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

He hecho los contiene elemento doble y el valor de retorno de doble opcionales implementaciones con éxito para reducir el uso de esta lista (). Todo lo que quiero saber es lo que es tan malo con el facultativo que termina modificando la fuente de datos en sí, que no debería suceder como corriente es funcional.

Giacomo Alzetta:

La lambda:

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

Está modificando el bparámetro. Tenga en cuenta que una asignacion no no copiar un objeto de modo Transaction z = bque se acaba de dar un alias para el objeto al que apunta b.

Que es mejor usar la reducesobrecarga que permite especificar la identidad y combinador, os acaba de crear una copia del objeto.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=233757&siteId=1
Recomendado
Clasificación