合并和排序多个Java 8流

4
我有多个学生对象的流。我需要按排序顺序合并它们。
class Student {
    private String branch;
    private Integer rollNo;
    private Date doj;
    // Getters and Setters
}

在另一个类中,我有一个方法。
private Stream<Student> mergeAndSort(Stream<Student> s1, Stream<Student> s2, Stream<Student> s3) {
    return Stream.of(s1, s2, s3).sorted(...
        // I tried this logic multiple times but is not working. How can I inject Student comparator here.
        // I have to sort based on branch and then rollNo.
    );
}

我认为问题中缺少引用的逻辑。你只需要在那里放置Comparator。重要的是你代码中比较器的定义。 - Naman
在排序之前,您必须调用.flatMap(Function.identity())。此外,您可以更改方法的签名为mergeAndSort(Stream<Student>... s1) - Adrian
1个回答

6

Stream.of(s1, s2, s3)会给你一个Stream<Stream<Student>>。为了得到一个Stream<Student>,使用flatMap

Stream.of(s1, s2, s3).flatMap(Function.identity()).sorted(...)...

按照所需属性进行排序:

return Stream.of(s1, s2, s3)
             .flatMap(Function.identity())
             .sorted(Comparator.comparing(Student::getBranch).thenComparing(Student::getRollNo));

Stream.concat(Stream.concat(s1, s2), s3).sorted(...) 怎么样? - Ousmane D.
从评论中进一步阅读,我必须根据分支和然后是rollNo进行排序 ... sorted(Comparator.comparing(Student::getBranch).thenComparing(Student::getRollNo)) - Naman
@Aomine 一个好的阅读材料在这里 - Naman
@Aomine 我不知道。对我来说似乎不够优雅。也许如果有一个接受多个Streamconcat()变体会更好。 - Eran
2
@Aomine 两种变体都有优缺点,所以没有明确的决定。concat是早期绑定,它允许保留大小信息并支持并行流拆分,但在嵌套太多时容易出现堆栈溢出。相比之下,flatMap适用于大量子流,但对于较大的子流效率较低,特别是在旧版Java中由于缺乏惰性(这使得它甚至会在无限流中断开)。因此,对于合并三个未知大小的流的任务,我会选择concat... - Holger
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接