Stream流操作如何实现复杂数据处理?

2026-04-28 09:152阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1152个文字,预计阅读时间需要5分钟。

Stream流操作如何实现复杂数据处理?

简单看看Stream流。

Stream流操作。

简单看看 Stream 流。 Stream流操作 #2

工作中总是见到这种之前没见过的用法,必须学习一下了。

Stream 流是 Java8 的新特性,通过它可以以声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

+--------------------+ +------+ +---+ +------+ +-------+ | stream of elements +-----> |filter+-> |map+-> |sorted+-> |collect| +--------------------+ +------+ +---+ +------+ +-------+

什么是 Stream

Stream(流)是来自数据源的元素队列,且可以进行一系列的聚合操作。

  1. 元素是特定类型的对象,形成一个队列。
  2. 数据源:流的来源。可以是集合,数组,I/O channel, 产生器 generator 等。
  3. 聚合操作:类似SQL语句一样的操作, 如 filter、map、reduce、find、match、sorted 等。
  4. Pipelining:在流中的操作都会返回流对象本身,因此多个操作可以串联成一个管道,如同水流过在不同的管道中进行处理一样。
  5. 内部迭代:之前对集合进行遍历都是通过迭代器 Iterator 或外部 For-Each 的方式,但 Stream 提供了内部迭代的 forEach 方法,由访问者模式实现。
流操作 生成流

在 Java8 中有两个方式生成流:

  1. 使用 stream() 创建串行流;
  2. 使用 parallelStream() 创建并行流。

List<String> strings = Arrays.asList("abc", "id", "qiyuanc", "fqqy", "fgh","jkl"); strings.stream(); strings.parallelStream(); forEach

通过 Stream 流提供的 forEach 方法可以在内部对集合进行遍历:

public class Demo { @Test public void Demo1(){ List<String> strings = Arrays.asList("abc", "id", "qiyuanc", "fqqy", "fgh", "jkl"); strings.stream().forEach(System.out::println); } } /* abc id qiyuanc fqqy fgh jkl */ filter

通过 Stream 流中的 filter 方法,可以对元素进行一些过滤操作,此处过滤掉空串后接上上面的内部迭代:

public class Demo { @Test public void Demo1(){ // 集合中有空串 List<String> strings = Arrays.asList("abc", "", "id", "qiyuanc", "fqqy", "", "fgh", "jkl"); // 过滤空串 strings.stream().filter(s -> !s.isEmpty()).forEach(System.out::println); } } /* abc id qiyuanc fqqy fgh jkl */ map

map 是一个非常强大的功能,这个操作会遍历流,并可以将其中的元素映射到对应的结果:

public class Demo { @Test public void Demo1(){ // 集合 List<String> strings = Arrays.asList("abc", "", "id", "qiyuanc", "fqqy", "", "fgh", "jkl"); // 过滤空串 并映射为对应的结果 strings.stream().filter(s -> !s.isEmpty()).map( s -> s + "/map").forEach(System.out::println); } } /* abc/map id/map qiyuanc/map fqqy/map fgh/map jkl/map */ sorted

sorted 操作可以对流进行排序,使用非常简单:

Stream流操作如何实现复杂数据处理?

public class Demo { @Test public void Demo1(){ // 集合 List<String> strings = Arrays.asList("abc", "", "id", "qiyuanc", "fqqy", "", "fgh", "jkl"); // 过滤空串 并映射为对应的结果 strings.stream().filter(s -> !s.isEmpty()).map( s -> s + "/map").sorted().forEach(System.out::println); } } /* abc/map fgh/map fqqy/map id/map jkl/map qiyuanc/map */ collector

collector 操作的参数是 Collectors 类的方法,这个类实现了许多归约操作,可以将流转换为集合或聚合元素,一般用在流的结尾,也表明这个流已经处理完毕:

public class Demo { @Test public void Demo1(){ // 原集合 List<String> strings = Arrays.asList("abc", "", "id", "qiyuanc", "fqqy", "", "fgh", "jkl"); // 流 转换为 集合 List<String> stringList = strings.stream().filter(s -> !s.isEmpty()).map( s -> s + "/map").sorted().collect(Collectors.toList()); // 流 转换为 聚合 String stringJoin = strings.stream().filter(s -> !s.isEmpty()).map( s -> s + "/map").sorted().collect(Collectors.joining(",")); System.out.println("转换为集合:" + stringList); System.out.println("转换为聚合:" + stringJoin); } } /* 转换为集合:[abc/map, fgh/map, fqqy/map, id/map, jkl/map, qiyuanc/map] 转换为聚合:abc/map,fgh/map,fqqy/map,id/map,jkl/map,qiyuanc/map */

流的功能还是非常强大的!而且流的操作还不只这些,在这只是列举了一些比较常用的。

本文共计1152个文字,预计阅读时间需要5分钟。

Stream流操作如何实现复杂数据处理?

简单看看Stream流。

Stream流操作。

简单看看 Stream 流。 Stream流操作 #2

工作中总是见到这种之前没见过的用法,必须学习一下了。

Stream 流是 Java8 的新特性,通过它可以以声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

+--------------------+ +------+ +---+ +------+ +-------+ | stream of elements +-----> |filter+-> |map+-> |sorted+-> |collect| +--------------------+ +------+ +---+ +------+ +-------+

什么是 Stream

Stream(流)是来自数据源的元素队列,且可以进行一系列的聚合操作。

  1. 元素是特定类型的对象,形成一个队列。
  2. 数据源:流的来源。可以是集合,数组,I/O channel, 产生器 generator 等。
  3. 聚合操作:类似SQL语句一样的操作, 如 filter、map、reduce、find、match、sorted 等。
  4. Pipelining:在流中的操作都会返回流对象本身,因此多个操作可以串联成一个管道,如同水流过在不同的管道中进行处理一样。
  5. 内部迭代:之前对集合进行遍历都是通过迭代器 Iterator 或外部 For-Each 的方式,但 Stream 提供了内部迭代的 forEach 方法,由访问者模式实现。
流操作 生成流

在 Java8 中有两个方式生成流:

  1. 使用 stream() 创建串行流;
  2. 使用 parallelStream() 创建并行流。

List<String> strings = Arrays.asList("abc", "id", "qiyuanc", "fqqy", "fgh","jkl"); strings.stream(); strings.parallelStream(); forEach

通过 Stream 流提供的 forEach 方法可以在内部对集合进行遍历:

public class Demo { @Test public void Demo1(){ List<String> strings = Arrays.asList("abc", "id", "qiyuanc", "fqqy", "fgh", "jkl"); strings.stream().forEach(System.out::println); } } /* abc id qiyuanc fqqy fgh jkl */ filter

通过 Stream 流中的 filter 方法,可以对元素进行一些过滤操作,此处过滤掉空串后接上上面的内部迭代:

public class Demo { @Test public void Demo1(){ // 集合中有空串 List<String> strings = Arrays.asList("abc", "", "id", "qiyuanc", "fqqy", "", "fgh", "jkl"); // 过滤空串 strings.stream().filter(s -> !s.isEmpty()).forEach(System.out::println); } } /* abc id qiyuanc fqqy fgh jkl */ map

map 是一个非常强大的功能,这个操作会遍历流,并可以将其中的元素映射到对应的结果:

public class Demo { @Test public void Demo1(){ // 集合 List<String> strings = Arrays.asList("abc", "", "id", "qiyuanc", "fqqy", "", "fgh", "jkl"); // 过滤空串 并映射为对应的结果 strings.stream().filter(s -> !s.isEmpty()).map( s -> s + "/map").forEach(System.out::println); } } /* abc/map id/map qiyuanc/map fqqy/map fgh/map jkl/map */ sorted

sorted 操作可以对流进行排序,使用非常简单:

Stream流操作如何实现复杂数据处理?

public class Demo { @Test public void Demo1(){ // 集合 List<String> strings = Arrays.asList("abc", "", "id", "qiyuanc", "fqqy", "", "fgh", "jkl"); // 过滤空串 并映射为对应的结果 strings.stream().filter(s -> !s.isEmpty()).map( s -> s + "/map").sorted().forEach(System.out::println); } } /* abc/map fgh/map fqqy/map id/map jkl/map qiyuanc/map */ collector

collector 操作的参数是 Collectors 类的方法,这个类实现了许多归约操作,可以将流转换为集合或聚合元素,一般用在流的结尾,也表明这个流已经处理完毕:

public class Demo { @Test public void Demo1(){ // 原集合 List<String> strings = Arrays.asList("abc", "", "id", "qiyuanc", "fqqy", "", "fgh", "jkl"); // 流 转换为 集合 List<String> stringList = strings.stream().filter(s -> !s.isEmpty()).map( s -> s + "/map").sorted().collect(Collectors.toList()); // 流 转换为 聚合 String stringJoin = strings.stream().filter(s -> !s.isEmpty()).map( s -> s + "/map").sorted().collect(Collectors.joining(",")); System.out.println("转换为集合:" + stringList); System.out.println("转换为聚合:" + stringJoin); } } /* 转换为集合:[abc/map, fgh/map, fqqy/map, id/map, jkl/map, qiyuanc/map] 转换为聚合:abc/map,fgh/map,fqqy/map,id/map,jkl/map,qiyuanc/map */

流的功能还是非常强大的!而且流的操作还不只这些,在这只是列举了一些比较常用的。