【发布时间】:2019-03-05 13:58:37
【问题描述】:
假设我们有如下两个流:
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.
是否有任何方便的方法可以使用 Java 8 流 API 将两个流合并到 [13, 1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 14]没关系)。还是只能同时处理一个流?
此外,如果这两个流是对象流,怎么可能只保留不同的对象,而不覆盖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 无关时,我们将其视为相同(因此 May 和 Marry 是同一个人,因为他们的数字都是“1”)。
我找到了distinct() 方法,但是这个方法是基于Object#equals() 的。如果不允许覆盖equals() 方法,如何将stream1 和stream2 合并到一个没有重复项的流中?
【问题讨论】:
-
你可以直接写
IntStream.of(13, 1, etc),而不是Arrays.stream(new int[] {13, 1, 3, 5, 7, 9});。
标签: java java-8 java-stream