【收藏】Java 8的 Stream 玩法大全

简介: 【收藏】Java 8的 Stream 玩法大全

前言


  Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。让程序员写出高效率、干净、简洁的代码。


什么是 Stream?


  Stream(流)是一个来自数据源的元素队列并支持聚合操作,流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。 Stream(流)的组成包含:元素、数据源、聚合操作、内部迭代、Pipelining等。

  • 元素:特定类型的对象
  • 数据源:流的来源,元素的集合,数组等。
  • 聚合操作:类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
  • 内部迭代:在流中内部迭代,与for外部处理不同。
  • Pipelining: 中间操作都会返回流对象本身。

Stream 基本操作


初始化两组数据

List<String> stringList = Arrays.asList("juejin", "zijie", "toutiao", "feidian", "join","", "juelimanman");
List<Integer> integerList = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7,8, 9, 10,11,12);


Stream 创建


stream()


  使用stream()创建串行流。

Stream<String> stream = stringList.stream();


parallelStream()

  parallelStream() 方法创建并行流

Stream<String> stringStream = stringList.parallelStream();


Arrays.stream()

  使用Arrays 中的 stream() 方法

Stream<String> stream1 = Arrays.stream(new String[10]);


Stream.of

  Stream.of创建流,创建的是有限流

Stream<String> streamOf = Stream.of("juejin", "zijie", "toutiao", "feidian", "join","", "juelimanman");


Stream.iterate

  Stream.iterate创建流,创建一个有序无限的数据流

Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 3).limit(5);


Stream.generate

  Stream.generate创建流,创建一个无限数据流

Stream<Double> stream3 = Stream.generate(Math::random).limit(2);


reader.lines

  使用 BufferedReader.lines() 方法,将每行内容转成流

Stream<String> lineStream = reader.lines();


Stream 操作


forEach


  forEach来迭代流中的每个数据,输出所有元素

stringList.forEach(System.out::println);


map

  map 方法用于映射每个元素到对应的结果

stringList.stream().map(i->i.equals("juejin"));


flatMap

  flatMap:将流中的每个值都换成另一个流,然后把所有流连接成一个流。

stream.flatMap(String::toUpperCase).collect(Collectors.toList());


filter

  filter 方法用于通过设置的条件过滤出元素,过滤流中的某些元素

stringList.stream().filter(i->i.equals("juejin"));


peek

   如同于map,能得到流中的每一个元素。但map接收的是一个Function表达式,有返回值;而peek接收的是Consumer表达式,没有返回值。

stream.peek(s -> s.equals("juejin"));


limit

  limit(n) 方法用于获取指定数量的流。例如:limit(n):获取n个元素

integerList.stream().limit(3);


skip

  skip(n):跳过n元素,配合limit(n)可实现分页

integerList.stream().skip(5).limit(3);


distinct

  distinct:通过流中元素的 hashCode() 和 equals() 去除重复元素

integerList.stream().distinct().collect(Collectors.toList());


sorted

  sorted sorted 方法用于对流进行排序,自然排序。

integerList.stream().sorted();


sorted(Comparator com)

  sorted(Comparator com):定制排序,自定义Comparator排序器

integerList.stream().sorted(Comparator.comparing(Integer::intValue));


parallel

  parallelStream 是流并行处理程序的代替方法。

integerList.parallelStream().sorted();


Collectors

  Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。

stringList.stream().filter(s -> s.equals("juejin")).collect(Collectors.toList());


count

  count 统计结果的收集器也非常有用,流的终止操作,用在流的最后。

integerList.stream().count();


allMatch

  allMatch:接收一个函数,当流中每个元素都符合该断言时才返回true,否则返回false,流的终止操作,用在流的最后

integerList.stream().allMatch(integer -> integer>0);


noneMatch

  noneMatch:接收一个函数,当流中每个元素都不符合该断言时才返回true,否则返回false,流的终止操作,用在流的最后。

integerList.stream().noneMatch(integer -> integer>100);


anyMatch

  anyMatch:接收一个函数,只要流中有一个元素满足该断言则返回true,否则返回false,流的终止操作,用在流的最后。

integerList.stream().anyMatch(integer -> integer>2);


findFirst

  findFirst:返回流中第一个元素,流的终止操作,用在流的最后。

stringList.stream().findFirst();


findAny

  findAny:返回流中的任意元素,流的终止操作,用在流的最后。

stringList.stream().findAny();


max

  max:返回流中元素最大值,流的终止操作,用在流的最后。

userList.stream().max(Comparator.comparingInt(user::score));


min

  min:返回流中元素最小值,流的终止操作,用在流的最后。

userList.stream().min(Comparator.comparingInt(user::score));


collect

  collect:接收一个Collector实例,将流中元素收集成另外一个数据结构。

integerList.stream().filter(u->user.getScore>60).collect(Collectors.toList());


总结


  Stream API 提供了一种高效且易于使用的处理数据的方式。让程序员写出高效率、干净、简洁的代码。在Stream流中都是使用复杂的表达式去处理数据逻辑,当然大家可以先了解这些方法,在项目中使用到的时候,再进行深入了解,进行更复杂的组合操作。


目录
相关文章
|
6月前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
174 0
|
2月前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
101 6
|
2月前
|
Java API 开发者
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
|
2月前
|
Rust 安全 Java
Java Stream 使用指南
本文介绍了Java中Stream流的使用方法,包括如何创建Stream流、中间操作(如map、filter、sorted等)和终结操作(如collect、forEach等)。此外,还讲解了并行流的概念及其可能带来的线程安全问题,并给出了示例代码。
131 0
|
4月前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
63 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
4月前
|
Java Shell 流计算
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
39 1
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
|
3月前
|
安全 Java API
Java中的Lambda表达式与Stream API的高效结合####
探索Java编程中Lambda表达式与Stream API如何携手并进,提升数据处理效率,实现代码简洁性与功能性的双重飞跃。 ####
44 0
|
3月前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
5月前
|
存储 Java API
Java——Stream流详解
Stream流是JDK 8引入的概念,用于高效处理集合或数组数据。其API支持声明式编程,操作分为中间操作和终端操作。中间操作包括过滤、映射、排序等,可链式调用;终端操作则完成数据处理,如遍历、收集等。Stream流简化了集合与数组的操作,提升了代码的简洁性
288 11
|
5月前
|
Java API C++
Java 8 Stream Api 中的 peek 操作
本文介绍了Java中`Stream`的`peek`操作,该操作通过`Consumer&lt;T&gt;`函数消费流中的每个元素,但不改变元素类型。文章详细解释了`Consumer&lt;T&gt;`接口及其使用场景,并通过示例代码展示了`peek`操作的应用。此外,还对比了`peek`与`map`的区别,帮助读者更好地理解这两种操作的不同用途。作者为码农小胖哥,原文发布于稀土掘金。
202 9
Java 8 Stream Api 中的 peek 操作