Java Stream常见用法汇总,开发效率大幅提升

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~

Github地址

如果访问不了Github,可以访问gitee地址。

gitee地址


Java8 新增的 Stream 流大大减轻了我们代码的工作量,但是 Stream 流的用法较多,实际使用的时候容易遗忘,整理一下供大家参考。

1. 概述

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来对 Java 集合运算和表达的高阶抽象。

Stream API 可以极大提高 Java 程序员的生产力,让程序员写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

Java Stream常见用法汇总,开发效率大幅提升

2. 创建

2.1 集合自带 Stream 流方法

List<String> list = new ArrayList<>();
// 创建一个顺序流
Stream<String> stream = list.stream();
// 创建一个并行流
Stream<String> parallelStream = list.parallelStream();

2.1 通过 Array 数组创建

最全面的Java面试网站

int[] array = {1,2,3,4,5};
IntStream stream = Arrays.stream(array);

2.3 使用 Stream 的静态方法创建

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<Integer> stream = Stream.iterate(0, (x) -> x + 3).limit(3); // 输出 0,3,6

Stream<String> stream = Stream.generate(() -> "Hello").limit(3); // 输出 Hello,Hello,Hello
Stream<Double> stream = Stream.generate(Math::random).limit(3); // 输出3个随机数

2.3 数值流

// 生成有限的常量流
IntStream intStream = IntStream.range(1, 3); // 输出 1,2
IntStream intStream = IntStream.rangeClosed(1, 3); // 输出 1,2,3
// 生成一个等差数列
IntStream.iterate(1, i -> i + 3).limit(5).forEach(System.out::println); // 输出 1,4,7,10,13
// 生成无限常量数据流
IntStream generate = IntStream.generate(() -> 10).limit(3); // 输出 10,10,10

另外还有 LongStream、DoubleStream 都有这几个方法。

3. 使用

初始化一些数据,示例中使用。

public class Demo {
    class User{
        // 姓名
        private String name;

        // 年龄
        private Integer age;
    }

    public static void main(String[] args) {
        List<User> users = new ArrayList<>();
        users.add(new User("Tom", 1));
        users.add(new User("Jerry", 2));
    }
}

3.1 遍历 forEach

// 循环输出user对象
users.stream().forEach(user -> System.out.println(user));

3.2 查找 find

// 取出第一个对象
User user = users.stream().findFirst().orElse(null); // 输出 {"age":1,"name":"Tom"}
// 随机取出任意一个对象
User user = users.stream().findAny().orElse(null);

3.3 匹配 match

// 判断是否存在name是Tom的用户
boolean existTom = users.stream().anyMatch(user -> "Tom".equals(user.getName()));
// 判断所有用户的年龄是否都小于5
boolean checkAge = users.stream().allMatch(user -> user.getAge() < 5);

3.4 筛选 filter

// 筛选name是Tom的用户
users.stream()
        .filter(user -> "Tom".equals(user.name))
        .forEach(System.out::println); // 输出 {"age":1,"name":"Tom"}

3.5 映射 map/flatMap

// 打印users里的name
users.stream().map(User::getName).forEach(System.out::println); // 输出 Tom Jerry
// List<List<User>> 转 List<User>
List<List<User>> userList = new ArrayList<>();
List<User> users = userList.stream().flatMap(Collection::stream).collect(Collectors.toList());

3.6 归约 reduce

// 求用户年龄之和
Integer sum = users.stream().map(User::getAge).reduce(Integer::sum).orElse(0);
// 求用户年龄的乘积
Integer product = users.stream().map(User::getAge).reduce((x, y) -> x * y).orElse(0);

3.7 排序 sorted

// 按年龄倒序排
List<User> collect = users.stream()
        .sorted(Comparator.comparing(User::getAge).reversed())
        .collect(Collectors.toList());

//多属性排序
List<Person> result = persons.stream()
                .sorted(Comparator.comparing((Person p) -> p.getNamePinyin())
                        .thenComparing(Person::getAge)).collect(Collectors.toList());

3.8 收集 collect

// list转换成map
Map<Integer, User> map = users.stream()
        .collect(Collectors.toMap(User::getAge, Function.identity()));

// 按年龄分组
Map<Integer, List<User>> userMap = users.stream().collect(Collectors.groupingBy(User::getAge));

// 求平均年龄
Double ageAvg = users.stream().collect(Collectors.averagingInt(User::getAge)); // 输出 1.5

// 求年龄之和
Integer ageSum = users.stream().collect(Collectors.summingInt(User::getAge));

// 求年龄最大的用户
User user = users.stream().collect(Collectors.maxBy(Comparator.comparing(User::getAge))).orElse(null);

// 把用户姓名拼接成逗号分隔的字符串输出
String names = users.stream().map(User::getName).collect(Collectors.joining(",")); // 输出 Tom,Jerry

3.9 List 转换成 Map 时遇到重复主键

Java Stream常见用法汇总,开发效率大幅提升

这样转换会报错,因为 ID 重复。

Java Stream常见用法汇总,开发效率大幅提升

可以这样做

Java Stream常见用法汇总,开发效率大幅提升

好东西应该要分享出来!我把自己学习计算机多年以来的书籍分享出来了,汇总到一个计算机经典编程书籍仓库了,一共300多本,包括C语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构和算法、机器学习、编程人生等,可以star一下,下次找书直接在上面搜索,仓库持续更新中~

Java Stream常见用法汇总,开发效率大幅提升

Java Stream常见用法汇总,开发效率大幅提升

Github地址

原文链接:https://www.cnblogs.com/tyson03/p/17320021.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Stream常见用法汇总,开发效率大幅提升 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • WIN2003上Apache2+IIS6+Tomcat5之多站点完美配置篇

    接下来我将为你详细讲解“WIN2003上Apache2+IIS6+Tomcat5之多站点完美配置篇”的完整攻略。 什么是Apache,IIS以及Tomcat Apache Apache是一款常用的Web服务器软件,支持多种操作系统和编程语言。它是自由软件,采用了Apache许可证,因此可以免费使用、复制、修改和分发。Apache的优点是简单易用、配置灵活、性…

    Java 2023年5月19日
    00
  • SpringBoot利用AOP实现一个日志管理详解

    来讲一下SpringBoot利用AOP实现一个日志管理的详细攻略。 一、前置知识 在讲解具体实现之前,需要对一些前置知识进行解释: 1.1 AOP AOP(Aspect Oriented Programming,面向切面编程)是一种编程思想,可以将与业务无关的部分(例如日志记录、权限验证等)剥离出来,通过以独立的方式进行定义和维护,将其在需要时运用进程序设计…

    Java 2023年5月19日
    00
  • java 多态实例代码

    我们来讲解一下“java 多态实例代码”的完整攻略。 什么是多态 多态是指同一种行为具有多个不同表现形式或形态的能力,即同一种行为基于不同的对象会产生不同的结果。在Java中,多态是指一个对象的实例在不同的情况下会表现出不同的行为。 多态的实现 在Java中,多态的实现主要有两种方式:继承和接口。通过继承实现多态,我们可以创建一个父类,然后在子类中重写其中一…

    Java 2023年5月30日
    00
  • Java实现广度优先遍历的示例详解

    Java实现广度优先遍历的示例详解 什么是广度优先遍历 广度优先遍历(Breadth First Search, BFS)是一种图形的遍历算法,其遍历能力基于层次高效地访问相邻节点,并按顺序访问节点。这种方式即宽度优先,图形遍历的起点为根节点,相关的数据结构是队列。 广度优先遍历的应用 广度优先遍历算法在许多领域都有应用,比如: 寻找最短路径 二叉树搜索 网…

    Java 2023年5月19日
    00
  • Java ArrayList源码深入分析

    Java ArrayList源码深入分析 概述 Java中的ArrayList是最基础的动态数组实现,是Java集合框架中的重要组成部分。本文将分析ArrayList源码,通过详细的代码解析和实例说明,深入分析ArrayList的内部实现原理。 前置知识 在深入分析ArrayList源码之前,需要具备以下基础知识: Java集合框架的基本概念和应用场景 数组…

    Java 2023年5月26日
    00
  • JSP自定义标签-标签属性_动力节点Java学院整理

    JSP自定义标签-标签属性 在进行JSP页面开发时,我们经常会遇到需要使用一些自定义的标签来进行页面的处理和数据展示,JSP提供了自定义标签的功能,我们可以通过定义标签来扩展JSP标准标签库中所提供的标签,或者是自定义一些用于当前项目的标签。本篇攻略主要介绍如何在自定义标签中使用标签属性。 标签属性的定义 标签属性可以理解为标签中用于传递参数的占位符,它用于…

    Java 2023年6月15日
    00
  • SpringSecurity 表单登录的实现

    实现SpringSecurity表单登录需要以下步骤: 导入依赖 需要在项目中导入SpringSecurity相关的依赖包,例如: <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-w…

    Java 2023年5月20日
    00
  • Sprint Boot @ConditionalOnProperty使用方法详解

    @ConditionalOnProperty是Spring Boot中的一个注解,它用于根据配置属性的值来决定是否启用或禁用某个组件。在使用Spring Boot开发应用程序时,@ConditionalOnProperty是非常有用的。本文将详细介绍@ConditionalOnProperty的作用和使用方法,并提供两个示例说明。 @ConditionalO…

    Java 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部