Java8 Stream 强大功能之统计、汇总、多字段分组和多个列汇总统计【含面试题】

面试题分享点我直达

2023最新面试合集链接

2023大厂面试题PDF

面试题PDF版本

java、python面试题

项目实战:AI文本 OCR识别最佳实践

AI Gamma一键生成PPT工具直达链接

玩转cloud Studio 在线编码神器

玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间

史上最全文档AI绘画stablediffusion资料分享

AI绘画关于SD,MJ,GPT,SDXL百科全书

AI绘画 stable diffusion Midjourney 官方GPT文档 AIGC百科全书资料收集

AIGC资料包

在现代Java开发中,Stream API 已经

成为一个强大的工具,它提供了一种简洁而灵活的方式来处理集合数据。其中,Stream API 统计、汇总、多字段分组和多个列汇总统计是使用频率较高的功能。本文将深入介绍这些功能,并提供一些代码示例。

一、统计功能:

  1. count():返回流中元素的总数。
  2. min() 和 max():返回流中的最小值和最大值。
  3. average():返回流中元素的平均值。
  4. sum():对流中的元素求和。

示例代码:

java 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

long count = numbers.stream().count();
Optional<Integer> max = numbers.stream().max(Integer::compareTo);
Optional<Integer> min = numbers.stream().min(Integer::compareTo);
double average = numbers.stream().mapToInt(Integer::intValue).average().orElse(0);
int sum = numbers.stream().mapToInt(Integer::intValue).sum();

二、汇总功能:

  1. reduce():将流中的元素进行累积计算,返回一个 Optional 对象。
  2. collect():将流中的元素收集到一个容器对象中,如 List、Set 或 Map。

示例代码:

java 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

Optional<Integer> sum = numbers.stream().reduce(Integer::sum);
List<Integer> squaredNumbers = numbers.stream().map(n -> n * n).collect(Collectors.toList());
Set<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toSet());
Map<String, List<Integer>> groupByOddEven = numbers.stream().collect(Collectors.groupingBy(n -> n % 2 == 0 ? "Even" : "Odd"));

三、多字段分组:

使用 Collectors.groupingBy 方法可以实现对流中元素的多字段分组。

示例代码:

java 复制代码
class Person {
    private String name;
    private int age;
    private String gender;

    // 省略构造函数和 Getter/Setter 方法

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

List<Person> people = Arrays.asList(
        new Person("Alice", 20, "Female"),
        new Person("Bob", 30, "Male"),
        new Person("Charlie", 25, "Male"),
        new Person("David", 22, "Male"),
        new Person("Eva", 28, "Female"),
        new Person("Frank", 35, "Male")
);

Map<String, List<Person>> byGender = people.stream().collect(Collectors.groupingBy(Person::getGender));
Map<Integer, List<Person>> byAge = people.stream().collect(Collectors.groupingBy(Person::getAge));

四、多个列汇总统计:

使用 Collectors.groupingBy 方法结合 Collectors.summarizingInt 方法可以实现对流中元素的多个列进行汇总统计。

示例代码:

java 复制代码
class Product {
    private String category;
    private String name;
    private int price;
    private int quantity;

    // 省略构造函数和 Getter/Setter 方法

    @Override
    public String toString() {
        return "Product{" +
                "category='" + category + '\'' +
                ", name='" + name + '\'' +
                ", price=" + price +
                ", quantity=" + quantity +
                '}';
    }
}

List<Product> products = Arrays.asList(
        new Product("Electronics", "Laptop", 2500, 5),
        new Product("Electronics", "Phone", 800, 3),
        new Product("Clothing", "Shirt", 40, 10),
        new Product("Clothing", "Pants", 60, 8),
        new Product("Books", "Java in Action", 50, 15),
        new Product("Books", "Clean Code", 80, 12)
);

Map<String, IntSummaryStatistics> statsByCategory = products.stream().collect(Collectors.groupingBy(Product::getCategory, Collectors.summarizingInt(Product::getQuantity)
相关推荐
敖云岚1 小时前
【Redis】分布式锁的介绍与演进之路
数据库·redis·分布式
LUCIAZZZ1 小时前
HikariCP数据库连接池原理解析
java·jvm·数据库·spring·springboot·线程池·连接池
我在北京coding2 小时前
300道GaussDB(WMS)题目及答案。
数据库·gaussdb
小Tomkk2 小时前
阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库
数据库·mysql·阿里云
明月醉窗台3 小时前
qt使用笔记二:main.cpp详解
数据库·笔记·qt
让我上个超影吧3 小时前
黑马点评【基于redis实现共享session登录】
java·redis
沉到海底去吧Go3 小时前
【图片自动识别改名】识别图片中的文字并批量改名的工具,根据文字对图片批量改名,基于QT和腾讯OCR识别的实现方案
数据库·qt·ocr·图片识别自动改名·图片区域识别改名·pdf识别改名
老纪的技术唠嗑局4 小时前
重剑无锋,大巧不工 —— OceanBase 中的 Nest Loop Join 使用技巧分享
数据库·sql
未来之窗软件服务4 小时前
JAVASCRIPT 前端数据库-V6--仙盟数据库架构-—-—仙盟创梦IDE
数据库·数据库架构·仙盟创梦ide·东方仙盟·东方仙盟数据库
一只爱撸猫的程序猿5 小时前
构建一个简单的智能文档问答系统实例
数据库·spring boot·aigc