Voglio riassumere un elenco di numeri interi. Funziona come segue, ma la sintassi non sembra corretta. Il codice potrebbe essere ottimizzato?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
i -> imolto chiaro, personalmente. Bene, sì, devi sapere che il valore verrà automaticamente decompresso, ma è vero dal momento che Java 5 ...
foo(int i)non scrivono foo(myInteger.intValue());ogni volta che lo chiamano (o almeno non mi aspetto !!). Sono d'accordo con te che Integer::intValueè più esplicito, ma penso che lo stesso valga qui. Le persone dovrebbero semplicemente impararlo una volta e poi il gioco è fatto :-). Non è come se fosse un po 'di offuscamento magico.
i -> isembra un no-op e, concettualmente, è un no-op. Certo, sotto il cofano Integer.intValue()viene chiamato, ma ancora più in profondità sotto il cofano, che i metodi vengono incorporati per diventare esattamente la no-op che sembra nel codice sorgente. Integer::intValueha il punto bonus di non creare un metodo sintetico nel codice byte ma non è ciò che dovrebbe guidare la tua decisione su come organizzare il tuo codice sorgente.
mapToLongper evitare overflow, a seconda dei valori che la tua mappa può avere.