Quiero resumir una lista de enteros. Funciona de la siguiente manera, pero la sintaxis no se siente bien. ¿Se podría optimizar el código?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
i -> i
muy claro, personalmente. Bueno, sí, necesita saber que el valor se desempaquetará automáticamente, pero es cierto desde Java 5 ...
foo(int i)
no escriben foo(myInteger.intValue());
cada vez que lo llaman (¡o al menos espero que no!). Estoy de acuerdo con usted en que Integer::intValue
es más explícito, pero creo que lo mismo se aplica aquí. La gente debería aprenderlo una vez y listo :-). No es como si fuera una ofuscación mágica.
i -> i
parece un no-op y, conceptualmente, es un no-op. Claro, bajo el capó Integer.intValue()
se llama, pero aún más profundo bajo el capó, esos métodos se alinean para convertirse exactamente en el no-op que parece en el código fuente. Integer::intValue
tiene el punto extra de no crear un método sintético en el código de bytes, pero no es lo que debe impulsar su decisión de cómo organizar su código fuente.
mapToLong
para evitar desbordamientos, dependiendo de los valores que pueda tener su mapa.