¿Cómo unir dos corrientes en Java?

weaver:

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 noes 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 stream1y stream2a una corriente que no tiene elementos duplicados?

Ousmane D .:

@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 toMapcolector, 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 Tartículos son todos distintos pero sin utilizar anulando equalsy hashcodecomo se ha mencionado.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=171871&siteId=1
Recomendado
Clasificación