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

Github地址

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

gitee地址


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

1. 概述

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

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

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

2. 创建

2.1 集合自带 Stream 流方法

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

2.1 通过 Array 数组创建

最全面的Java面试网站

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

2.3 使用 Stream 的静态方法创建

  1. Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
  2. Stream<Integer> stream = Stream.iterate(0, (x) -> x + 3).limit(3); // 输出 0,3,6
  3. Stream<String> stream = Stream.generate(() -> "Hello").limit(3); // 输出 Hello,Hello,Hello
  4. Stream<Double> stream = Stream.generate(Math::random).limit(3); // 输出3个随机数

2.3 数值流

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

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

3. 使用

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

  1. public class Demo {
  2. class User{
  3. // 姓名
  4. private String name;
  5. // 年龄
  6. private Integer age;
  7. }
  8. public static void main(String[] args) {
  9. List<User> users = new ArrayList<>();
  10. users.add(new User("Tom", 1));
  11. users.add(new User("Jerry", 2));
  12. }
  13. }

3.1 遍历 forEach

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

3.2 查找 find

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

3.3 匹配 match

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

3.4 筛选 filter

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

3.5 映射 map/flatMap

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

3.6 归约 reduce

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

3.7 排序 sorted

  1. // 按年龄倒序排
  2. List<User> collect = users.stream()
  3. .sorted(Comparator.comparing(User::getAge).reversed())
  4. .collect(Collectors.toList());
  5. //多属性排序
  6. List<Person> result = persons.stream()
  7. .sorted(Comparator.comparing((Person p) -> p.getNamePinyin())
  8. .thenComparing(Person::getAge)).collect(Collectors.toList());

3.8 收集 collect

  1. // list转换成map
  2. Map<Integer, User> map = users.stream()
  3. .collect(Collectors.toMap(User::getAge, Function.identity()));
  4. // 按年龄分组
  5. Map<Integer, List<User>> userMap = users.stream().collect(Collectors.groupingBy(User::getAge));
  6. // 求平均年龄
  7. Double ageAvg = users.stream().collect(Collectors.averagingInt(User::getAge)); // 输出 1.5
  8. // 求年龄之和
  9. Integer ageSum = users.stream().collect(Collectors.summingInt(User::getAge));
  10. // 求年龄最大的用户
  11. User user = users.stream().collect(Collectors.maxBy(Comparator.comparing(User::getAge))).orElse(null);
  12. // 把用户姓名拼接成逗号分隔的字符串输出
  13. String names = users.stream().map(User::getName).collect(Collectors.joining(",")); // 输出 Tom,Jerry

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

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

可以这样做

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

Github地址

Java Stream常见用法汇总,开发效率大幅提升的更多相关文章

  1. Java编程常见缺陷汇总(一)

     [案例1] public boolean equalNode(JudgeNode a, JudgeNode b) { return a.getId() == b.getId(); } [点评] 应在 ...

  2. curl命令常见用法汇总 good

    curl是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面. curl是一个强大的命令行工具,它可以通过网络将信息传递给服务器或者从服 ...

  3. java枚举常见用法

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  4. java中常见异常汇总(根据自己遇到的异常不定时更新)

    1.java.lang.ArrayIndexOutOfBoundsException:N(数组索引越界异常.如果访问数组元素时指定的索引值小于0,或者大于等于数组的长度,编译程序不会出现任何错误,但运 ...

  5. Java File常见用法

    一.构造方法 File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例. File(String pathname) 通过将给定的路径名字符 ...

  6. EntityFramework 常见用法汇总

    1.Code First 启用存储过程映射实体 1 protected override void OnModelCreating(DbModelBuilder modelBuilder) 2 { 3 ...

  7. pip常见用法汇总

    1.pip安装 yum -y install epel-release && yum -y install python-pip 2.pip安装软件 (1)安装单个软件:pip ins ...

  8. java字符串函数用法汇总

    替换字符串中的字符 例如有如下x的字符串 String x = "[kllkklk\kk\kllkk]"; 要将里面的"kk"替换为++,可以使用两种方法得到相 ...

  9. 讲透JAVA Stream的collect用法与原理,远比你想象的更强大

    大家好,又见面了. 在我前面的文章<吃透JAVA的Stream流操作,多年实践总结>中呢,对Stream的整体情况进行了细致全面的讲解,也大概介绍了下结果收集器Collectors的常见用 ...

  10. Java遇上SPL:架构优势和开发效率,一个不放过

    摘要:如果我们在Java中也提供有一套完整的结构化数据处理和计算类库,那这个问题就能得到解决:即享受到架构的优势,又不致于降低开发效率. 本文分享自华为云社区<Java结构化处理SPL>, ...

随机推荐

  1. 如何找到并使用makecert.exe

    如果安装visual studio 后,visual studio command  仍然无法识别 makecert.exe 命令. 则需要手动安装 Windows Software Developm ...

  2. 【ES6】迭代器

    简介 在 JavaScript 中,迭代器是一个对象,它定义一个序列,并在终止时可能返回一个返回值. 更具体地说,迭代器是通过使用 next() 方法实现迭代器协议的任何一个对象,该方法返回具有两个属 ...

  3. 网络存储服务ip-san搭建

                                         网络存储服务ip-san搭建 ip-san简称SAN(Storage Area Network),中文意思存储局域网络,ip- ...

  4. conda Installing on Linux - 搬运

    转自:Installing on Linux - conda 23.1.0 documentation Installing on Linux Download the installer: Min ...

  5. DOC命令学习(一)

    DOC命令学习(一) 命令 切换目录命令(cd) cd /d E: 查看目录命令(dir) dir   #查看# 回显命令(echo) @echo offset d = %date:~0,10%set ...

  6. 从babel编译结果分析class的实现原理

    示例: class A { // 属性表达式 prop1 = 1; // get方法 get value() { console.log('Getting the current value!'); ...

  7. CentOS /RHEL 系统更新安全补丁的方法

    在 Linux 系统上,其中一个最重要的需求就是保持定期更新最新的安全补丁,或者为相应的 Linux 版本更新可用的安全补丁.在这篇文章中,我们将分享如何在 CentOS/RHEL 7/6 版本中设置 ...

  8. 操作系统 && C语言 每日学习记录(day1 ~ day8) 已寄

    现在正式工作了,发现之前学的东西,很多一知半解,不通透,准备再好好系统学一些计算机原理的东西,每天学一学,在这里记录一下. 规划(7.17开始): 同学分享了个超级好的操作系统课程,每天看个一节:ht ...

  9. SpringBoot——自定义自动配置与起步依赖

    SpringBoot--自定义自动配置与起步依赖 SpringBoot为我们提供了灵活强大的自动配置与起步依赖功能,接下来我们参考其实现原理,实现专属于我们自己的自动配置与起步依赖. 不仅如此,我们对 ...

  10. CSS必知必会

    CSS概念 css的使用是让网页具有统一美观的页面,css层叠样式表,简称样式表,文件后缀名.css css的规则由两部分构成:选择器以及一条或者多条声明 选择器:通常是需要改变的HTML元素 声明: ...