Recibo un flujo de algunos objetos personalizados y me gustaría crear un mapa Map<Integer, MyObject>
con el índice de cada objeto como clave. Para darle un ejemplo simple:
Stream<String> myStream = Arrays.asList("one","two","three").stream();
Integer i = 0;
Map<Integer, String> result3 = myStream.collect(Collectors.toMap(x -> i++, x -> x));
Obviamente, esto no se compila porque:
las variables locales a las que se hace referencia desde una expresión lambda deben ser finales o efectivamente finales
¿Existe una manera simple de asignar elementos de una secuencia a sus índices para que el resultado esperado para el ejemplo anterior sea algo así como:
{1=one, 2=two, 3=three}
Solución del problema
Su i
variable no es efectivamente definitiva.
Puedes usar AtomicInteger
como Integer
envoltorio:
Stream<String> myStream = Arrays.asList("one","two","three").stream();
AtomicInteger atomicInteger = new AtomicInteger(0);
Map<Integer, String> result3 = myStream.collect(Collectors.toMap(x -> atomicInteger.getAndIncrement(), Function.identity()));
Lo considero un poco raro porque solo resuelve el problema de la variable final efectiva. Dado que es una versión especial de ThreadSafe, podría generar algunos gastos generales. stream
La solución pura en la respuesta de Samuel Philipp podría adaptarse mejor a sus necesidades.
No hay comentarios:
Publicar un comentario