Suppose we have two streams as follows:
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.
Is there any convenient way to merge these two streams without duplicates to [13, 1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 14] by using the Java 8 stream API (the order doesn't matter). Or can we only handle one stream at the same time?
Furthermore, if the two streams are object streams, how to keep only distinct objects without overriding the equals()
and hashCode()
methods? For example:
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'}
As long as their no
is the same we consider them to be the same student. (so May and Marry are the same person because their numbers are both "1").
I've found the distinct()
method, but this method is based on Object#equals()
. If we are not allowed to overwrite the equals()
method, how can we merge stream1
and stream2
to one stream which has no duplicate items?
Arrays.stream(new int[] {13, 1, 3, 5, 7, 9});
you can write directlyIntStream.of(13, 1, etc)
. – LehrStream.concat(stream1, stream2)
will concatenate the streams. Excluding duplicates according to a property has its own full answer here: https://mcmap.net/q/63615/-java-8-distinct-by-property/1108305. – Tenantry