`
JerryWang_SAP
  • 浏览: 1031620 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

使用Java Stream API将List按自定义分组规则转换成Map的一个例子

阅读更多

本文完整测试代码见文末。

测试数据是List里的4个员工对象实例:

 

 

根据员工所在的城市进行分组:

 

 

结果分成了三组:

第一组的员工在上海:

 

 

第二组的员工在成都:

 

 

统计每组员工个数:

 

 

把员工进行分组,得分大于101分的在一组,小于等于101的在另一组:

 

 

分组结果:

 

 

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 class
public 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);*/

         /*
          * 分区是一种特殊的分组,结果 map 至少包含两个不同的分组——一个true,一个false。
          * 例如,如果想找出最优秀的员工,你可以将所有雇员分为两组,一组销售量大于 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 收集器来将联合使用分区和分组。例如,你可以统计每个分区中的每个城市的雇员人数:
        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的原创文章,请关注公众号"汪子熙":

0
0
分享到:
评论

相关推荐

    java行转列的例子

    - 创建一个新的List或Map来存储转换后的数据。 - 对于多列数据,可能需要创建一个二维数组或使用ArrayList来存储。 5. 数据库操作: - 如果数据来自数据库,可能需要使用JDBC或其他ORM框架(如Hibernate、...

    SpringBoot+Mybatis,返回Map的时候,将Map内的Key转换为驼峰的命名

    在这个例子中,`toCamelCaseMap`方法接收一个Map,并使用Java 8的Stream API来创建一个新的Map,其中的Key已经被`underscoreToCamelCase`方法转换为驼峰命名。`underscoreToCamelCase`方法则负责将下划线分隔的字符...

    讲透JAVAStream的collect用法与原理远比你想象的更强大

    而`collect`操作是Stream API中的一个重要组成部分,它用于将Stream中的元素聚合到一个容器中,如List、Set或Map等。本文将深入讲解`collect`操作及其背后的Collectors工具类,探讨如何利用它们实现更高效的数据处理...

    Java Map 按值排序

    总结来说,Java提供了多种方式来对Map按值进行排序,包括使用TreeMap、Collections.sort、Stream API以及Guava库。选择哪种方法取决于项目需求和个人喜好,但在Java 8及更高版本中,Stream API通常被认为是最简洁和...

    java8实战:使用流收集数据之toList、joining、groupBy(多字段分组)

    例如,假设我们有一个包含多个Person对象的流,每个对象都有名字和年龄属性,我们可以使用`toList`轻松创建一个新的Person对象列表: ```java List&lt;Person&gt; people = Stream.of(new Person("Alice", 25), new ...

    黑马程序员Java函数式编程全套视频教程,Lambda表达式、Stream流、函数式编程一套全通关1

    例如,`list.stream().filter(x -&gt; x &gt; 10).map(x -&gt; x * 2).collect(Collectors.toList())` 这段代码会过滤出列表中大于10的元素,然后将这些元素乘以2,最后将结果收集到一个新的列表中。 Stream API中的一个重要...

    stream流操作demo

    在Java编程语言中,Stream API是Java 8引入的一个强大特性,它提供了处理集合数据的新方式,使得数据处理更加简洁、高效。Stream API允许我们以声明性方式处理数据,非常适合进行聚合操作,如过滤、映射和减少。下面...

    Java8如何构建一个Stream示例详解

    Java 8 引入了 Stream API,这是一个革命性的特性,极大地改进了集合处理的方式。Stream API 提供了一种声明性处理数据的方式,使得代码更加简洁、高效。在本文中,我们将深入探讨如何在 Java 8 中构建和使用 Stream...

    java小例子

    每个“Java小例子”都是一个独立的学习单元,帮助开发者逐步掌握Java语言的核心概念和实践技巧。如果在运行这些例子时遇到缺少的包,可能需要根据代码内容手动导入相应的Java库,例如`import java.util.*;`用于访问...

    Java之Stream

    为了更好地理解 Stream 的使用方式,我们可以从一个简单的例子入手:从一个水果集合中筛选出苹果,并按照价格降序排列,最后得到一个只包含价格的列表。 ##### 需求描述 假设有一个水果集合,我们需要从中提取出...

    Java收集器接口.pdf

    在Java编程中,`Collector`接口是Java 8引入的一个重要特性,它是Stream API的核心组成部分,主要用于实现数据的收集操作,比如将Stream转换为集合、计算聚合结果等。`Collector`接口定义了四个核心方法和一个可选...

    java 实现多个list 合并成一个去掉重复的案例

    在这个例子中,我们首先将`listx`转换为一个Map,键是`SkillUpgrade`对象的`lv`属性,值是`SkillUpgrade`对象本身。然后,我们遍历`lists`,如果找到相同的`lv`值,就将`listx`中的相应对象的`selectNum`值复制到`...

    Java8HashMap键与Comparable接口编程开

    如果我们创建一个HashMap, String&gt;,并想要获取按年龄升序排列的键值对,我们可以使用Java 8的Stream API: ```java Map, String&gt; map = new HashMap(); // 添加元素... List&lt;Map.Entry, String&gt;&gt; sortedEntries =...

    【Java开发bug100例】3.使用java8抽取对象属性(csdn)————程序.pdf

    在本案例中,我们将深入探讨如何利用Java 8的流API来抽取对象属性,具体通过一个例子来分析。 题目中的代码片段展示了如何从`field`集合中抽取满足特定条件的对象属性,并将其转换成`List&lt;String&gt;`。首先,我们看到...

    java8Lambda10个案例

    4. **映射操作**:`map()`方法可以使用Lambda将列表中的每个元素转换为新类型,如`list.stream().map(String::length).collect(Collectors.toList())`获取字符串列表的长度列表。 5. **并行流**:Lambda可以与并行...

    java函数数组A(18)个.zip

    例如,我们可能有一个`List,Integer&gt;&gt;`,其中每个函数都能将字符串转换为整数。 5. **流(Stream)与函数操作** Java 8的Stream API支持函数式编程,我们可以对函数数组进行操作,如映射、过滤和归约。例如,我们...

    java实用100例 60-100

    77.JSON处理:示例可能涵盖使用Gson或Jackson库将Java对象转换为JSON字符串,以及反序列化回Java对象。 78.XML处理:DOM、SAX和StaX API可用于解析和生成XML文档,示例可能涵盖这些API的使用。 79.图形绘制:Java...

    JAVA类集应用

    Java 类集(Collections)是Java编程语言中一个重要的组成部分,它包含了各种数据结构,如列表、集合、映射等,以及对这些数据结构进行操作的工具类。在本压缩包中,你将找到一系列关于Java类集应用的源码实例,这些...

    java实用程序设计100例

    "说明.txt"可能是对每个例子的简短描述,而"使用说明.url"可能指向一个网页,提供了更详细的解释或使用指南。通过这些实例,初学者或有经验的开发者都能深化对Java的理解,并提升自己的编程能力。

    java_lambda_stream

    Java Lambda 和 Stream API 是 Java 8 引入的两个重要特性,它们极大地简化了代码,提高了编程效率。Lambda 表达式是函数式编程的核心概念,而 Stream API 则为处理大量数据提供了一种高效、易读的方式。下面将详细...

Global site tag (gtag.js) - Google Analytics