Supongamos que tenemos dos corrientes de la siguiente manera:
IntStream stream1 = Arrays.stream(new int[] {13, 1, 3, 5, 7, 9});
IntStream stream2 = Arrays.stream(new int[] {1, 2, 6, 14, 8, 10, 12});
stream1.merge(stream2); // some method which is used to merge two streams.
¿Hay alguna forma conveniente para combinar las dos corrientes a [13, 1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 14] mediante la API de corriente Java 8 (el orden no importa) . ¿O podemos manejar solamente una corriente al mismo tiempo?
Por otra parte, si las dos corrientes son corrientes de objetos, ¿cómo es posible mantener sólo objetos distintos, sin anular las equals()
y hashCode()
los métodos? Por ejemplo:
public class Student {
private String no;
private String name;
}
Student s1 = new Student("1", "May");
Student s2 = new Student("2", "Bob");
Student s3 = new Student("1", "Marry");
Stream<Student> stream1 = Stream.of(s1, s2);
Stream<Student> stream2 = Stream.of(s2, s3);
stream1.merge(stream2); // should return Student{no='1', name='May'} Student{no='2', name='Bob'}
Consideramos dos estudiantes del mismo cuando su no
es la misma e independientemente de la name
(de modo mayo y se casan son la misma persona, porque sus números son tanto "1").
He encontrado el distinct()
método, pero este método se basa en Object#equals()
. Si no se nos permite sobrescribir el equals()
método, ¿cómo podemos combinar stream1
y stream2
a una corriente que no tiene elementos duplicados?
@Jigar Joshi ha respondido a la primera parte de su pregunta, que es "cómo combinar dos de IntStream en uno" .
Su otra pregunta de "cómo combinar dos Stream<T>
sin sobrescribir la equals()
y hashCode()
método?" puede hacerse utilizando el toMap
colector, es decir, suponiendo que no desea que el resultado como una Stream<T>
. Ejemplo:
Stream.concat(stream1, stream2)
.collect(Collectors.toMap(Student::getNo,
Function.identity(),
(l, r) -> l,
LinkedHashMap::new)
).values();
si desea que el resultado como un Stream<T>
entonces se podría hacer:
Stream.concat(stream1, stream2)
.collect(Collectors.collectingAndThen(
Collectors.toMap(Student::getNo,
Function.identity(),
(l, r) -> l,
LinkedHashMap::new),
f -> f.values().stream()));
Esto no es, posiblemente, todo lo eficiente que puede ser pero es otra manera de devolver un Stream<T>
donde los T
artículos son todos distintos pero sin utilizar anulando equals
y hashcode
como se ha mencionado.