Java8流式编程GroupBy和求最值示例

news/2025/2/26 4:53:25

流的创建(演示常用的)

数组创建

Arrays.stream
Arrays的静态方法stream() 可以获取数组流

	 String[] arr = { "a", "b", "c", "d", "e", "f", "g" };
	 Stream<String> stream = Stream.of(arr);
	 Stream<String> stream1 = Arrays.stream(arr);

集合创建

Collection接口提供了两个默认方法创建流:stream()、parallelStream()

	List<String> list = new ArrayList<String>();
	list.add("a");
	list.add("b");
	list.add("c");
	Stream<String> stream = list.stream();

值创建

Stream.of

使用静态方法 Stream.of(), 通过显示值创建一个流。它可以接收任意数量的参数。

	Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);

函数创建

Stream.iterate
Stream.generate
使用静态方法 Stream.iterate() 和 Stream.generate()创建无限流。

	Stream<Double> stream = Stream.generate(Math::random).limit(5);
	Stream<Integer> stream1 = Stream.iterate(0, i -> i + 1).limit(5);

注意:使用无限流一定要配合limit截断,不然会无限制创建下去。

GroupBy和求最值示例

实体类:

package com.demo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

/** lombok的使用需要的依赖:
 <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <version>1.18.16</version>
 </dependency>
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {
    private long id;
    private String name;
    private int age;
    private int grade;
    private String major;
    private String school;
}

 示例代码:

package com.demo;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;

public class FileTest {
    public static void main(String[] args) {
       /*------------------复杂对象演示------------------------*/
        List<Student> students = new ArrayList<Student>() {
            {
                add(new Student(20160001, "孔明", 20, 1, "土木工程", "武汉大学"));
                add(new Student(20160003, "玄德", 22, 3, "经济管理", "武汉大学"));
                add(new Student(20161001, "翼德", 21, 2, "机械与自动化", "华中科技大学"));
                add(new Student(20161003, "奉孝", 23, 4, "计算机科学", "华中科技大学"));
                add(new Student(20163001, "丁奉", 24, 5, "土木工程", "南京大学"));
            }
        };

        // group by 统计用法示例
        Map<String, Long> group2 = students.stream().collect(
                Collectors.groupingBy(
                        Student::getSchool,
                        Collectors.counting()
                )
        );
        //输出:{南京大学=1, 武汉大学=2, 华中科技大学=2}
        System.out.println(group2);

        TreeMap<String, Set<String>> collect = students.stream().collect(
                Collectors.groupingBy(
                        Student::getSchool,
                        TreeMap::new,
                        Collectors.mapping(Student::getName, Collectors.toSet())
                )
        );
        //输出:{华中科技大学=[翼德, 奉孝], 南京大学=[丁奉], 武汉大学=[孔明, 玄德]}
        System.out.println(collect);


        Map<String, List<Student>> collect3 = students.stream().collect(
                Collectors.groupingBy(
                        Student::getSchool
                )
        );
        /* 输出:{
                南京大学=[Student(id=20163001, name=丁奉, age=24, grade=5, major=土木工程, school=南京大学)],
                武汉大学=[
                    Student(id=20160001, name=孔明, age=20, grade=1, major=土木工程, school=武汉大学),
                    Student(id=20160003, name=玄德, age=22, grade=3, major=经济管理, school=武汉大学)
                 ],
                 华中科技大学=[
                    Student(id=20161001, name=翼德, age=21, grade=2, major=机械与自动化, school=华中科技大学),
                    Student(id=20161003, name=奉孝, age=23, grade=4, major=计算机科学, school=华中科技大学)
                  ]
              }
        *
        */
        System.out.println(collect3);

        // 求最大  最小值
        Student studentMax = students.stream().max((s1, s2) -> s1.getAge() - s2.getAge()).get();
        Student studentMin = students.stream().min((s1, s2) -> s1.getAge() - s2.getAge()).get();
        // 输出:Student(id=20163001, name=丁奉, age=24, grade=5, major=土木工程, school=南京大学)
        System.out.println(studentMax);
        // 输出:Student(id=20160001, name=孔明, age=20, grade=1, major=土木工程, school=武汉大学)
        System.out.println(studentMin);





        /*------------------基础数据类型演示------------------------*/
        List<Integer> list = new ArrayList<Integer>() {
            {
                add(20);
                add(18);
                add(18);
                add(17);
            }
        };
        Map<Integer, Long> collect1 = list.stream().collect(
                Collectors.groupingBy(
                        (integer) -> integer,
                        Collectors.counting()
                )
        );
        // 输出:{17=1, 18=2, 20=1}
        System.out.println(collect1);

        TreeMap<Integer, List<Integer>> collect2 = list.stream().collect(
                Collectors.groupingBy(
                        Integer::intValue,
                        TreeMap::new,
                        Collectors.mapping((integer) -> integer, Collectors.toList())
                )
        );
        // 输出:{17=[17], 18=[18, 18], 20=[20]}
        System.out.println(collect2);

        Integer max = list.stream().max(Integer::compareTo).get();
        Integer min = list.stream().min(Integer::compareTo).get();
        System.out.println(max);// 输出:20
        System.out.println(min);// 输出:17


        /*------------------map集合演示------------------------*/
        List<Map<String,Object>> list2 = new ArrayList<Map<String,Object>>() {
            {
                add(new HashMap<String,Object>(){{
                    put("prdTyp","lon");
                    put("typ","2.3");
                }});
                add(new HashMap<String,Object>(){{
                    put("prdTyp","lon");
                    put("typ","1.0");
                }});
                add(new HashMap<String,Object>(){{
                    put("prdTyp","lpr");
                    put("typ","88");
                }});
                add(new HashMap<String,Object>(){{
                    put("prdTyp","lpr");
                    put("typ","99");
                }});

            }
        };

        Map<Object, List<Map<String, Object>>> prdTyp = list2.stream().collect(
                Collectors.groupingBy( (map) -> map.get("prdTyp") )
        );
        /* 输出:{
                    lon=[{prdTyp=lon, typ=2.3}, {prdTyp=lon, typ=1.0}],
                    lpr=[{prdTyp=lpr, typ=88}, {prdTyp=lpr, typ=99}]
                }
        */
        System.out.println(prdTyp);


        TreeMap<Object, List<Object>> collect4 = list2.stream().collect(
                Collectors.groupingBy(
                        (map) -> map.get("prdTyp"),
                        TreeMap::new,
                        Collectors.mapping((map) -> map.get("prdTyp"), Collectors.toList())
                )
        );
        // 输出:{lon=[lon, lon], lpr=[lpr, lpr]}
        System.out.println(collect4);

        Optional<Map<String, Object>> mapMax = list2.stream().max(
                Comparator.comparing( (map) -> new BigDecimal((String) map.get("typ")) )
        );
        // mapMax直接输出:Optional[{prdTyp=lpr, typ=99}]
        System.out.println(mapMax.get().get("typ"));//99

        Optional<Map<String, Object>> mapMin = list2.stream().min(
                (map1,map2)->new BigDecimal((String) map1.get("typ")).compareTo(new BigDecimal((String) map2.get("typ")))
        );
        // mapMin直接输出:Optional[{prdTyp=lon, typ=1.0}]
        System.out.println(mapMin.get().get("typ"));//1.0

    }


}


http://www.niftyadmin.cn/n/4054432.html

相关文章

JavaScript中常见的字符串操作函数及用法汇总

转载地址&#xff1a;http://www.jb51.net/article/65358.htm这篇文章主要介绍了JavaScript中常见的字符串操作函数及用法,实例汇总了javascript常见的字符串转换、分割、查询、替换等技巧,非常具有实用价值,需要的朋友可以参考下。本文实例总结了JavaScript中常见的字符串操作…

基于Redis实现分布式定时任务调度

项目开发过程中&#xff0c;难免会有许多定时任务的需求进来。如果项目中还没有引入quarzt框架的情况下&#xff0c;我们通常会使用Spring的Schedule(cron"* * * * *")注解 样例如下&#xff1a; package com.slowcity.redis;import org.slf4j.Logger; import org.…

linux路由route

一、永久添加路由 重启network服务生效 支持用#注释 方法一 a、添加默认网关&#xff0c;即默认路由 两块网卡在配置文件ifcfg-ethX中不配置网关&#xff0c;在/etc/sysconfig/network中设置默认网关 vim /etc/sysconfig/network GATEWAY192.168.14.254 b、添加路由 创…

mybatis-plus开启sql日志打印

方法一&#xff1a; mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志或者&#xff1a;mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl #关闭sql日志 方法二&#xff1a; loggin…

phonegap(cordova) 自己定义插件代码篇(三)----支付宝支付工具整合

建议读者&#xff0c;先阅读官方文档&#xff0c;知晓其支付流程之后再来使用此代码&#xff0c;比方客户须要做什么&#xff0c;服务端须要做什么&#xff08;非常重要&#xff01;非常重要&#xff01;非常重要&#xff01;&#xff09;&#xff0c;由于这几个篇幅都是纯代码…

mybatis实现自定义分页插件

一、环境搭建 创建一个maven工程&#xff0c;然后引入mybatis依赖和mysql依赖即可。 <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.0.4</version> </dependency> <dependency…

Objective-C 引用计数原理

http://www.cocoachina.com/ios/20160112/14933.html 引用计数如何存储 有些对象如果支持使用 TaggedPointer&#xff0c;苹果会直接将其指针值作为引用计数返回&#xff1b;如果当前设备是 64 位环境并且使用 Objective-C 2.0&#xff0c;那么“一些”对象会使用其 isa 指针的…

使用Iterator对List集合进行增加或者删除操作时报异常的分析

一、问题 使用Iterator在对List集合进行遍历集合时&#xff0c;如果只是遍历而不进行增加、删除操作时&#xff0c;可以正常运行吗&#xff0c;但是如果我们在使用迭代器对List集合进行插入或者删除时&#xff0c;就会出现Exception in thread "main" java.util.Con…