List<ManualInfo> manuals = manualRepository.manuals();
manuals.stream()
.collect(
groupingBy( // group 1
ManualInfo::getLargeClass,
groupingBy( // group 2
ManualInfo::getMediumClass,
groupingBy( //group 3
ManualInfo::getSmallClass,
)
)
)
);
為了以類別結構(json)回應手冊,從資料庫中檢索所有手冊,然后進行分組。這些類別的結構按照我想要的方式進行,但順序不正確。
研究了很久才發現,分組前排序不行,分組后不能排序。
如下圖,我最近學習了如何按順序分組,這也可以應用到類別結構中嗎?
LinkedHashMap<String, List<ManualInfo>> collect = manuals.stream()
.collect(groupingBy(ManualInfo::getLargeClass, // group1
LinkedHashMap::new, // how can i do group2, group3....?
toList()));
uj5u.com熱心網友回復:
如果您對串列中元素的初始順序感到滿意,那么您需要使用三引數版本,groupingBy()該版本允許提供一個Supplier mapFactory來代替代碼中的每個 二引數分組。
并且這些收集器中的每一個都應指定LinkedHashMap為所需的累積型別:
List<ManualInfo> manuals = manualRepository.manuals();
var resultingMap = manuals.stream()
.collect(Collectors.groupingBy( // group 1
ManualInfo::getLargeClass,
LinkedHashMap::new,
Collectors.groupingBy( // group 2
ManualInfo::getMediumClass,
LinkedHashMap::new,
Collectors.groupingBy( //group 3
ManualInfo::getSmallClass,
LinkedHashMap::new,
Collectors.toList()
)
)
));
請注意,必須提供下游收集器作為具有這種風格的最后一個引數, groupingBy() 對于第一個和第二個收集器,下游將是隨后的嵌套分組,對于最后一個我們需要 toList() 作為下游提供(用于在單引數版本的 groupingBy()) 中隱含在幕后。
如果資料的排序不符合您的要求,那么您需要在收集資料之前對元素進行排序。
假設ManualInfo看起來像這樣:
public class ManualInfo {
private String largeClass;
private String mediumClass;
private String smallClass;
// getters, constructors, etc.
}
假設您希望資料首先按 排序largeClass,然后按 排序mediumClass,最后按 排序smallClass。然后,使用介面的 Java 8static方法Comparator,我們可以定義以下比較器(您可以使用任何您需要的排序標準,這只是如何構建比較器的示例):
Comparator.comparing(ManualInfo::getLargeClass)
.thenComparing(ManualInfo::getMediumClass)
.thenComparing(ManualInfo::getSmallClass)
代碼可能如下所示:
var resultingMap = manuals.stream()
.sorted( // imposing the required ordering
Comparator.comparing(ManualInfo::getLargeClass)
.thenComparing(ManualInfo::getMediumClass)
.thenComparing(ManualInfo::getSmallClass)
)
.collect(Collectors.groupingBy( // group 1
ManualInfo::getLargeClass,
LinkedHashMap::new,
Collectors.groupingBy( // group 2
ManualInfo::getMediumClass,
LinkedHashMap::new,
Collectors.groupingBy( //group 3
ManualInfo::getSmallClass,
LinkedHashMap::new,
Collectors.toList()
)
)
));
還有另一種如何強制排序的選項。您可以TreeMap用作累積型別。
但請注意,它僅在所需的排序與分組標準完全匹配TreeMap時才有效,因為維護基于鍵的排序順序。
var resultingMap = manuals.stream()
.collect(Collectors.groupingBy( // group 1
ManualInfo::getLargeClass,
TreeMap::new,
Collectors.groupingBy( // group 2
ManualInfo::getMediumClass,
TreeMap::new,
Collectors.groupingBy( //group 3
ManualInfo::getSmallClass,
TreeMap::new,
Collectors.toList()
)
)
));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/522671.html
標籤:爪哇春天弹簧靴排序分组
