Comparando todas las combinaciones de elementos en una Colección a través de la API de Streams.
Estoy intentando comparar todas las combinaciones (es decir, sin comparaciones duplicadas) de elementos en un HashMap y devolver una lista de todos los elementos de dicho HashMap que satisfagan la función de comparación, utilizando el API de Streams de Java 8.
Es decir, quiero algo como esto:
// seudocódigo, este no es el trabajo del HashMap, pero espero que se entienda el punto
para(int i=0; i<myhashmap.entryset().length, i++)=”” para(int=”” j=”i+1,”></myhashmap.entryset().length,><myhashmap.entryset().length) {
si(mycomparison(entryset.get(i), entryset.get(j)))
mylist.add(new myclass[] {entryset.get(i), entryset.get(j)})
}
pero utilizando el api de streams. tengo una versión que casi funciona usando .foreach e iterando simplemente dos veces sobre el stream, sin embargo, esto tiene el problema de ejecutar comparaciones duplicadas y, por lo tanto, agregar esas duplicaciones a la lista de nuevo. estoy bastante seguro de que el operador reduce es capaz de lo que necesito, pero no estoy familiarizado con el api de streams en absoluto y no puedo entender cómo lograr el resultado deseado. {=”” si(mycomparison(entryset.get(i),=”” entryset.get(j)))=”” mylist.add(new=”” myclass[]=”” {entryset.get(i),=”” entryset.get(j)})=”” }=”” pero=”” utilizando=”” el=”” api=”” de=”” streams.=”” tengo=”” una=”” versión=”” que=”” casi=”” funciona=”” usando=”” .foreach=”” e=”” iterando=”” simplemente=”” dos=”” veces=”” sobre=”” el=”” stream,=”” sin=”” embargo,=”” esto=”” tiene=”” el=”” problema=”” de=”” ejecutar=”” comparaciones=”” duplicadas=”” y,=”” por=”” lo=”” tanto,=”” agregar=”” esas=”” duplicaciones=”” a=”” la=”” lista=”” de=”” nuevo.=”” estoy=”” bastante=”” seguro=”” de=”” que=”” el=”” operador=”” reduce=”” es=”” capaz=”” de=”” lo=”” que=”” necesito,=”” pero=”” no=”” estoy=”” familiarizado=”” con=”” el=”” api=”” de=”” streams=”” en=”” absoluto=”” y=”” no=”” puedo=”” entender=”” cómo=”” lograr=”” el=”” resultado=””></myhashmap.entryset().length) {
si(mycomparison(entryset.get(i), entryset.get(j)))
mylist.add(new myclass[] {entryset.get(i), entryset.get(j)})
}
pero utilizando el api de streams. tengo una versión que casi funciona usando .foreach e iterando simplemente dos veces sobre el stream, sin embargo, esto tiene el problema de ejecutar comparaciones duplicadas y, por lo tanto, agregar esas duplicaciones a la lista de nuevo. estoy bastante seguro de que el operador reduce es capaz de lo que necesito, pero no estoy familiarizado con el api de streams en absoluto y no puedo entender cómo lograr el resultado deseado.>
davy.ai
Puedes usar el operador
flatMap
para lograr el resultado deseado. El operadorflatMap
toma un flujo de elementos y produce un flujo de elementos a partir de los elementos del flujo original. En este caso, puedes usarflatMap
para crear un flujo de todas las combinaciones de elementos en elHashMap
y luego usar el operadorfilter
para filtrar los elementos que satisfacen la función de comparación. Finalmente, puedes usar el operadorcollect
para recopilar los elementos en unaList
.Aquí tienes un ejemplo de cómo puedes usar el operador
flatMap
para lograr el resultado deseado:java
</myclass[]>List<myclass[]> myList = myHashMap.entrySet().stream()
.flatMap(entry1 -> myHashMap.entrySet().stream()
.filter(entry2 -> myComparison(entry1, entry2))
.map(entry2 -> new MyClass[] {entry1, entry2}))
.collect(Collectors.toList());