Como mesclar dois fluxos em Java?

tecelão:

Suponha que temos duas correntes como segue:

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.

Existe alguma maneira conveniente para fundir as duas correntes a [13, 1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 14], utilizando o Java 8 fluxo de API (a ordem não importa) . Ou podemos apenas lidar com um fluxo ao mesmo tempo?

Além disso, se as duas correntes são fluxos de objetos, como é possível manter apenas objetos distintos, sem substituir as equals()e hashCode()métodos? Por exemplo:

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 dois estudantes o mesmo quando a sua noé a mesma e independentemente da name(assim maio e Marry são a mesma pessoa, porque os seus números são tanto "1").

Eu encontrei o distinct()método, mas este método baseia-se Object#equals(). Se nós não estão autorizados a substituir o equals()método, como podemos unir stream1e stream2a um riacho que não tem itens duplicados?

Ousmane D .:

@Jigar Joshi respondeu à primeira parte da sua pergunta que é "como mesclar dois IntStream de em um" .

Sua outra pergunta de "como mesclar dois Stream<T>sem substituir o equals()e hashCode()método?" pode ser feito usando o toMapcoletor, ou seja, supondo que você não quer que o resultado como um Stream<T>. Exemplo:

Stream.concat(stream1, stream2)
      .collect(Collectors.toMap(Student::getNo, 
               Function.identity(), 
               (l, r) -> l, 
               LinkedHashMap::new)
      ).values();

se você quiser o resultado como um Stream<T>então pode-se fazer:

 Stream.concat(stream1, stream2)
       .collect(Collectors.collectingAndThen(
               Collectors.toMap(Student::getNo,
                    Function.identity(),
                    (l, r) -> l,
                    LinkedHashMap::new), 
                    f -> f.values().stream()));

Este não é, possivelmente, tão eficiente quanto ele pode ser, mas é uma outra maneira de voltar a Stream<T>onde os Titens são todos distintos, mas sem o uso de substituir equalse hashcodecomo você mencionou.

Acho que você gosta

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