Как объединить два потока в Java? - PullRequest
0 голосов
/ 30 сентября 2018

Предположим, у нас есть два потока следующим образом:

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.

Есть ли какой-нибудь удобный способ объединить два потока в [13, 1, 2, 3, 5, 6, 7, 8, 9,10, 12, 14] с использованием потокового API Java 8 (порядок не имеет значения).Или мы можем обрабатывать только один поток одновременно?

Кроме того, если два потока являются потоками объектов, как можно сохранить только отдельные объекты без переопределения методов equals() и hashCode()?Например:

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'}

Мы считаем, что два студента одинаковы, когда их no одинаковы и независимо от name (поэтому Мэй и Мэри состоят из одного человека, потому что их числа равны «1»).).

Я нашел метод distinct(), но этот метод основан на Object#equals().Если нам не разрешено перезаписывать метод equals(), как мы можем объединить stream1 и stream2 в один поток, в котором нет повторяющихся элементов?

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

@ Джигар Джоши ответил на первую часть вашего вопроса, которая является "как объединить два IntStream's в один" .

Ваш другой вопрос "как объединить два Stream<T>без перезаписи equals() и hashCode() метода? "это можно сделать с помощью коллектора toMap, т. е. если вы не хотите, чтобы результат был Stream<T>.Пример:

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

, если вы хотите получить результат как Stream<T>, тогда можно сделать:

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

Возможно, это не так эффективно, как может быть, но это другой способверните Stream<T>, где все элементы T различны, но без использования переопределения equals и hashcode, как вы упомянули.

0 голосов
/ 30 сентября 2018

Вы можете использовать concat()

IntStream.concat(stream1, stream2)
...