一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

使用Java Stream API將List按自定義分組規(guī)則轉(zhuǎn)換成Map的一個例子

 汪子熙 2020-04-28

本文完整測試代碼見文末。

測試數(shù)據(jù)是List里的4個員工對象實例:

根據(jù)員工所在的城市進行分組:

結(jié)果分成了三組:

第一組的員工在上海:

第二組的員工在成都:

統(tǒng)計每組員工個數(shù):


把員工進行分組,得分大于101分的在一組,小于等于101的在另一組:

分組結(jié)果:


package java8;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.function.Consumer;import java.util.stream.Collectors;class Employee {
    private String city;
    private String name;
    private int score;
    
    public Employee(String name, String city, int score){
        this.city = city;
        this.name = name;
        this.score = score;
    }
    
    public String getCity(){
        System.out.println("city: " + this.city);
        return this.city;
    }
    
    public String getName() {
        return this.name;
    }
    
    public int getScore() {
        return this.score;
    }
    
    @Override
    public String toString() {
        return String.format("Employee: " + this.name + " city: " + this.city);
    }}class Person {
    private String name;
    private int age;
 
    Person(String name, int age) {
 
        this.name = name;
        this.age = age;
    }
 
    @Override
    public String toString() {
        return String.format("Person{name='%s', age=%d}", name, age);
    }}// Jerry 2016-01-15 20:51PM ? 多用于extends generic的type,接受所有Object的sub classpublic class StreamTest {
    private static void printMap(Map<? extends Object, ? extends Object> map) {
         for(Entry<? extends Object, ? extends Object> entry:map.entrySet()) {
                System.out.println("key = " + entry.getKey() + " , Value = " + entry.getValue());
             }
    }
    
    public static void main(String[] args) {
        ArrayList<Employee> employees = new ArrayList<Employee>();
        employees.add(new Employee("A", "Shanghai",100));
        employees.add(new Employee("B", "Chengdu",101));
        employees.add(new Employee("C", "Shenzhen",102));
        employees.add(new Employee("D", "Chengdu",104));
        
        // group by City
        Map<String, List<Employee>> employeesByCity =
                employees.stream().collect( Collectors.groupingBy(Employee::getCity));
        //  default void forEach(Consumer<? super T> action) {
        for(Map.Entry<String, List<Employee>> entry:employeesByCity.entrySet()) {
            System.out.println("key= " + entry.getKey() + " , Value = " + entry.getValue());
            entry.getValue().forEach(System.out::println);
         }
         
         // 2016-01-15 20:37PM 
         Consumer<Employee> aa = a -> { System.out.println("Employee: " + a.getName() + " : " +  a.getScore()); };
         List<Employee> chengduEmployee = employeesByCity.get("Chengdu");
         chengduEmployee.forEach(aa);
         
         // test for counting
         Map<String, Long> employeesByCity2 = 
                 employees.stream().collect( Collectors.groupingBy(Employee::getCity, Collectors.counting()));
         printMap(employeesByCity2);
        
         // calculate average score
         Map<String, Double> employeesByCity3 = 
                 employees.stream().collect( Collectors.groupingBy(Employee::getCity,
                         Collectors.averagingInt(Employee::getScore)));
         
         printMap(employeesByCity3);
        /*Stream<Person> people = Stream.of(new Person("Paul", 24), new Person("Mark", 30), new Person("Will", 28));
        Map<Integer, List<String>> peopleByAge = people.collect(groupingBy(p -> p.age, mapping((Person p) -> p.name, toList())));
        System.out.println(peopleByAge);*/
         
         /*
          * 分區(qū)是一種特殊的分組,結(jié)果 map 至少包含兩個不同的分組——一個true,一個false。
          * 例如,如果想找出最優(yōu)秀的員工,你可以將所有雇員分為兩組,一組銷售量大于 N,
          * 另一組小于 N,使用 partitioningBy 收集器:
          */
         System.out.println("partition result");
         Map<Boolean, List<Employee>> partitioned =
                 employees.stream().collect(Collectors.partitioningBy(e -> e.getScore() > 101));
         printMap(partitioned);
         
         /*
          * 你也可以將 groupingBy 收集器傳遞給 partitioningBy 收集器來將聯(lián)合使用分區(qū)和分組。例如,你可以統(tǒng)計每個分區(qū)中的每個城市的雇員人數(shù):

        Map<Boolean, Map<String, Long>> result =
        employees.stream().collect(partitioningBy(e -> e.getNumSales() > 150,
        groupingBy(Employee::getCity, counting())));

        這樣會生成一個二級 Map:

        {false={London=1}, true={New York=1, Hong Kong=1, London=1}}
          */
    }}

要獲取更多Jerry的原創(chuàng)文章,請關(guān)注公眾號"汪子熙":

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产午夜在线精品视频| 精品al亚洲麻豆一区| 尤物久久91欧美人禽亚洲| 成人日韩视频中文字幕| 国产99久久精品果冻传媒| 日韩中文字幕有码午夜美女| 美国欧洲日本韩国二本道| 国产免费无遮挡精品视频| 日本不卡一本二本三区| 日本亚洲精品在线观看| 亚洲国产精品久久网午夜| 男人和女人干逼的视频| 日韩免费国产91在线| 97人妻精品免费一区二区| 色哟哟哟在线观看视频| 欧洲自拍偷拍一区二区| 免费在线观看激情小视频| 欧美不卡一区二区在线视频| 亚洲少妇人妻一区二区| 粉嫩国产美女国产av| 伊人色综合久久伊人婷婷| 国产精品午夜小视频观看| 日韩欧美三级中文字幕| 久久精品色妇熟妇丰满人妻91| 日韩视频在线观看成人| 欧美精品女同一区二区| 99国产高清不卡视频| 国产午夜精品亚洲精品国产| 久久精品亚洲欧美日韩| 亚洲精品一区三区三区| 黄色片一区二区三区高清| 欧美日韩国产欧美日韩| 国产亚洲欧美日韩国亚语| 在线免费视频你懂的观看| 欧美精品女同一区二区| 欧美色欧美亚洲日在线| 亚洲精品有码中文字幕在线观看| 五月天婷亚洲天婷综合网| 亚洲国产色婷婷久久精品| 国产成人精品在线一区二区三区| 激情五月激情婷婷丁香|