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 ivariable no es efectivamente definitiva.
Puedes usar AtomicIntegercomo Integerenvoltorio:
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. streamLa solución pura en la respuesta de Samuel Philipp podría adaptarse mejor a sus necesidades.
No hay comentarios:
Publicar un comentario