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 -> i
molto 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 -> i
sembra 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::intValue
ha 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.
mapToLong
per evitare overflow, a seconda dei valori che la tua mappa può avere.