簡體   English   中英

如何限制groupBy java流

[英]How to limit in groupBy java stream

這是我課程中名為Course課程模型:

public class Course{
    private int courseId;
    private String courseName;
    private Teacher teacher;
}

這是我在班級Teacher老師模型:

public class Teacher{
    private int teacherId;
    private String name;
}

我想獲得一個Map<String, List<Course>>但是如果要重復teacherId ,只需將該Course添加到地圖列表中。

我正在使用groupBy

Map<Integer, List<Course>>  result = courses.stream()
        .collect(Collectors.groupingBy(c -> c.getTeacher().getTeacherId(), Collectors.toList()));

它正在按預期給出結果。

但我想在此limit ,只要找到5名教師停止處理並返回結果。

如何做呢??

沒有直接支持這一點,因為停止和生活可能不完整的數據是相當不尋常的。

完全收集前五個組的直接解決方案是

Set<Integer> firstFive = courses.stream()
    .map(c -> c.getTeacher().getTeacherId())
    .distinct().limit(5)
    .collect(Collectors.toSet());
Map<Integer, List<Course>> result = courses.stream()
    .filter(c -> firstFive.contains(c.getTeacher().getTeacherId()))
    .collect(Collectors.groupingBy(c -> c.getTeacher().getTeacherId()));

這里,前五個教師ID的Course列表已經完成。


在遇到第5個教師ID后真正停止的解決方案,循環更簡單:

Map<Integer, List<Course>> result = new HashMap<>();
for(Course c: courses) {
    result.computeIfAbsent(c.getTeacher().getTeacherId(), x -> new ArrayList<>()).add(c);
    if(result.size() == 5) break;
}

但收集Course列表沒有多大意義,之后你不能相信這些列表。 請記住,即使源列表的最后一個元素也可能屬於第一個遇到的教師ID,因此即使您只對一個教師的完整課程列表感興趣,也需要處理整個列表。

不確定這是不是你要問的。

Map<Integer, List<Course>> map = new HashMap<>();

courses.stream().filter(course -> map.keySet().size() < 10)
    .forEach(entry -> {
       // The code below can be simplified
      int teacherId = entry.getTeacher().getTeacherId();
      if(map.get(teacherId) != null)
        map.get(teacherId).add(entry);
      else
        map.put(teacherId, Lists.newArrayList(entry));
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM