Java8 使用流對集合進行分組操作

實體對象

@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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章