【收藏】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流中都是使用复杂的表达式去处理数据逻辑,当然大家可以先了解这些方法,在项目中使用到的时候,再进行深入了解,进行更复杂的组合操作。


目录
相关文章
|
1月前
|
SQL Java API
使用Java Stream API简化集合操作
使用Java Stream API简化集合操作
|
3天前
|
Java API 开发者
|
11天前
|
存储 算法 Oracle
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
39 8
|
9天前
|
自然语言处理 Java API
"告别Java8 Stream噩梦,JDFrame神器来袭!让你的代码简洁如诗,效率翻倍,编程新体验等你尝鲜!"
【8月更文挑战第11天】Java 8的Stream API以强大的函数式编程能力革新了集合数据处理方式,但其抽象概念和复杂的链式调用让不少开发者望而却步。为此,JDFrame框架应运而生,通过直观易懂的操作符简化Stream使用,减少代码量并提高效率。
25 3
|
14天前
|
数据可视化 IDE Java
Java8的Stream流太难用了?看看JDFrame带来的革新体验
【8月更文挑战第6天】在Java开发者的日常工作中,Java 8引入的Stream API无疑是一个革命性的特性,它极大地简化了集合(Collection)的处理方式,使得数据操作更加声明式、函数式。然而,对于初学者或是从早期Java版本迁移过来的开发者而言,Stream API的复杂性和抽象性可能会成为一道门槛。今天,我们就来探讨如何通过JDFrame这样的工具或框架,以及掌握一些高效学习策略,让Java Stream的使用变得更加得心应手。
51 5
|
13天前
|
存储 Java API
探索Java中的Stream API: 提升数据处理的效率与优雅
在Java的海洋中,Stream API如同一股清流,为数据处理注入了新的活力。本文将深入探讨Stream API的核心概念、操作以及它如何改变我们编写和理解代码的方式。通过实际案例,我们将揭示这一现代编程范式如何简化集合处理,提高代码的可读性与性能。
|
17天前
|
Java API 数据处理
Java 8新特性:Stream API的实用指南
【8月更文挑战第3天】在Java 8中,最引人注目的新特性之一是Stream API。这个API允许开发者以声明式方式处理数据集合,提供了一种高效且易于理解的数据处理方法。本文将介绍Stream API的基本概念、常用操作以及如何在实际开发中应用。
|
2天前
|
并行计算 Java API
|
4天前
|
前端开发 Oracle Java
Java 22 新增利器: 使用 Java Stream Gather 优雅地处理流中的状态
本文我们分析了 什么 是 “流”,对比了 Java 上几种常见的 “流”库,引入和详细介绍了 Java 22 中的 Stream Gather API 。同时也简单分享了利用 虚拟线程 如何简化 StreammapConcurrent操作符的实现。
|
4天前
|
Java API
Java8 Lambda 设计和实现问题之在Java 8的Stream API中,parallel=false时collect方法是如何实现的
Java8 Lambda 设计和实现问题之在Java 8的Stream API中,parallel=false时collect方法是如何实现的