實體對象
@Data
@AllArgsConstructor
public class Kvs<T> {
private String key;
private T value;
}
代碼實操
public class AnswerApp {
public static void main(String[] args) {
List<Kvs<String>> kvsList = Lists.newArrayList(
new Kvs<>("A0001", "Answer"),new Kvs<>("A0001", "AnswerAIL"),new Kvs<>("A0001", "AI"),
new Kvs<>("A0002", "Iris"),new Kvs<>("A0002", "IrisA"),new Kvs<>("A0003", "Allen"),
new Kvs<>("A004", "James"),new Kvs<>("A005", "Kak"),new Kvs<>("A005", "KaKa")
);
// 對 key 進行統計個數
Map<String, Long> map1 = kvsList.stream().collect(Collectors.groupingBy(Kvs::getKey, Collectors.counting()));
System.out.println("map1=" + JSON.toJSONString(map1));
System.out.println();
// 根據 key 對集合進行分組-1
Map<String, List<Kvs>> map2_1 = kvsList.stream().collect(Collectors.groupingBy(Kvs::getKey, Collectors.toList()));
System.out.println("map2_1=" + JSON.toJSONString(map2_1));
System.out.println();
// 根據 key 對集合進行分組-2
Map<String, List<Kvs>> map2_2 = kvsList.stream().collect(Collectors.groupingBy(Kvs::getKey));
System.out.println("map2_2=" + JSON.toJSONString(map2_2));
System.out.println();
// 根據 key 對集合進行分組, 並且 value 的集合爲指定屬性集合而不是對象
Map<String, List<String>> map3 = kvsList.stream().collect(Collectors.groupingBy(Kvs::getKey, Collectors.mapping(Kvs::getValue, Collectors.toList())));
System.out.println("map3=" + JSON.toJSONString(map3));
System.out.println();
// 根據 key 進行分組並且將指定屬性值進行拼接作爲哈希表的 value 值
Map<String, String> map4 = kvsList.stream().collect(Collectors.groupingBy(Kvs::getKey, Collectors.mapping(Kvs::getValue, Collectors.joining("#"))));
System.out.println("map4=" + JSON.toJSONString(map4));
System.out.println();
// 根據 key 進行分組並根據 指定屬性進行比較取最大元素
Map<String, Optional<Kvs<String>>> map5 = kvsList.stream().collect(Collectors.groupingBy(Kvs::getKey, Collectors.maxBy(Comparator.comparing(Kvs::getValue))));
System.out.println("map5=" + JSON.toJSONString(map5));
System.out.println();
// partitioningBy 會根據 傳入的 表達式進行判斷, 將集合分爲 true 和 false 兩個列表
Map<Boolean, List<Kvs>> map6 = kvsList.stream().collect(Collectors.partitioningBy(kvs -> "A0001".equals(kvs.getKey())));
System.out.println("map6=" + JSON.toJSONString(map6));
System.out.println();
// 遍歷結果集
kvsList.stream().collect(Collectors.groupingBy(Kvs::getKey, Collectors.toList())).forEach((k, v) -> {
System.out.println(MessageFormat.format("key={0}, value={1}", k, v));
});
List<Kvs<Integer>> numList = Lists.newArrayList(
new Kvs<>("A001", 1),new Kvs<>("A001", 2),new Kvs<>("A001", 3),
new Kvs<>("A002", 5),new Kvs<>("A002", 3),new Kvs<>("A003", 7)
);
System.out.println();
// 根據 key 進行分組並且根據 指定數據進行統計
Map<String, Integer> num1 = numList.stream().collect(Collectors.groupingBy(Kvs::getKey, Collectors.summingInt(Kvs::getValue)));
System.out.println("num1=" + JSON.toJSON(num1));
System.out.println();
// summarizingInt 用來同時計算 average、min、max、count、sum
Map<String, IntSummaryStatistics> num2 = numList.stream().collect(Collectors.groupingBy(Kvs::getKey, Collectors.summarizingInt(Kvs::getValue)));
System.out.println("num2=" + JSON.toJSON(num2));
System.out.println();
}
}
程序輸出
map1={"A0001":3,"A0002":2,"A005":2,"A004":1,"A0003":1}
map2_1={"A0001":[{"key":"A0001","value":"Answer"},{"key":"A0001","value":"AnswerAIL"},{"key":"A0001","value":"AI"}],"A0002":[{"key":"A0002","value":"Iris"},{"key":"A0002","value":"IrisA"}],"A005":[{"key":"A005","value":"Kak"},{"key":"A005","value":"KaKa"}],"A004":[{"key":"A004","value":"James"}],"A0003":[{"key":"A0003","value":"Allen"}]}
map2_2={"A0001":[{"key":"A0001","value":"Answer"},{"key":"A0001","value":"AnswerAIL"},{"key":"A0001","value":"AI"}],"A0002":[{"key":"A0002","value":"Iris"},{"key":"A0002","value":"IrisA"}],"A005":[{"key":"A005","value":"Kak"},{"key":"A005","value":"KaKa"}],"A004":[{"key":"A004","value":"James"}],"A0003":[{"key":"A0003","value":"Allen"}]}
map3={"A0001":["Answer","AnswerAIL","AI"],"A0002":["Iris","IrisA"],"A005":["Kak","KaKa"],"A004":["James"],"A0003":["Allen"]}
map4={"A0001":"Answer#AnswerAIL#AI","A0002":"Iris#IrisA","A005":"Kak#KaKa","A004":"James","A0003":"Allen"}
map5={"A0001":{"key":"A0001","value":"AnswerAIL"},"A0002":{"key":"A0002","value":"IrisA"},"A005":{"key":"A005","value":"Kak"},"A004":{"key":"A004","value":"James"},"A0003":{"key":"A0003","value":"Allen"}}
map6={false:[{"key":"A0002","value":"Iris"},{"key":"A0002","value":"IrisA"},{"key":"A0003","value":"Allen"},{"key":"A004","value":"James"},{"key":"A005","value":"Kak"},{"key":"A005","value":"KaKa"}],true:[{"key":"A0001","value":"Answer"},{"key":"A0001","value":"AnswerAIL"},{"key":"A0001","value":"AI"}]}
key=A0001, value=[Kvs(key=A0001, value=Answer), Kvs(key=A0001, value=AnswerAIL), Kvs(key=A0001, value=AI)]
key=A0002, value=[Kvs(key=A0002, value=Iris), Kvs(key=A0002, value=IrisA)]
key=A005, value=[Kvs(key=A005, value=Kak), Kvs(key=A005, value=KaKa)]
key=A004, value=[Kvs(key=A004, value=James)]
key=A0003, value=[Kvs(key=A0003, value=Allen)]
num1={"A003":7,"A001":6,"A002":8}
num2={"A003":{"average":7.0,"min":7,"max":7,"count":1,"sum":7},"A001":{"average":2.0,"min":1,"max":3,"count":3,"sum":6},"A002":{"average":4.0,"min":3,"max":5,"count":2,"sum":8}}
擴展-20190809
// List<T> 轉 Map<T#Prop, Map<T#Prop2, T#Prop3>>
List<Kvi> params = Lists.newArrayList();
// 加工數據... params.add(new Kvi());
/*
* -----------------------------------------------------------------------------------------------------------------------------------------------------
* 丨 params 丨 rleParams
* -----------------------------------------------------------------------------------------------------------------------------------------------------
* 丨 1, Name, zhangsan 丨
* 丨 1, Liandate, 20190809 丨
* 丨 1, Status, Open 丨 {1: {Name: zhangsan, Liandate: 20190809, Status: Open}, 2: {Name: lisi, Liandate: 20190809, Status: Close}}
* 丨 2, Name, lisi 丨
* 丨 2, Liandate, 20190809 丨
* 丨 2, Status, Close 丨
* -----------------------------------------------------------------------------------------------------------------------------------------------------
* */
Map<Integer, Map<String, String>> rleParams = params.stream().collect(Collectors.groupingBy(Kvi::getIndex, Collectors.toMap(Kvi::getKey, Kvi::getValue)));
@Data
public class Kvi {
private Integer index;
private String key;
private String value;
}