GOOGLE ADS

viernes, 22 de abril de 2022

¿Cómo mapear elementos a su índice usando flujos?

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

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...