Java基础之Stream

简介:   流表示一系列元素并支持不同类型的操作来对这些元素执行计算。在Java 8中,Collection接口有两种方法来生成Stream  stream()parallelStream()  流操作包括中间或终端,中间操作返回一个流,所以我们可以链接多个中间操作而不使用分号。 终端操作是void的或返回非流结果。  Stream是可以执行顺序和并行聚合操作的一系列元素 。 任何给定的“Stream”都可能有无限量的数据流过它。 你所得到的结果是从“Stream”接收的数据在到达时被单独处理,而不是完全对数据执行批处理。 当与lambda表达式 结合时,它们提供了使用函数方法对数据序列执

  流表示一系列元素并支持不同类型的操作来对这些元素执行计算。在Java 8中,Collection接口有两种方法来生成Stream

  stream()parallelStream()

  流操作包括中间或终端,中间操作返回一个流,所以我们可以链接多个中间操作而不使用分号。 终端操作是void的或返回非流结果。

  Stream是可以执行顺序和并行聚合操作的一系列元素 。 任何给定的“Stream”都可能有无限量的数据流过它。 你所得到的结果是从“Stream”接收的数据在到达时被单独处理,而不是完全对数据执行批处理。 当与lambda表达式 结合时,它们提供了使用函数方法对数据序列执行操作的简明方法。

  Stream fruitStream=Stream.of("apple", "banana", "pear", "kiwi", "orange");

  fruitStream.filter(s -> s.contains("a"))

  .map(String::toUpperCase)

  .sorted()

  .forEach(System.out::println);

  上述代码执行的操作可以总结如下:

  1. 使用静态工厂方法Stream.of(values)创建一个包含fruit String的顺序排序Stream的Stream 元素;

  2. filter()操作仅保留与给定谓词(由谓词返回true测试时的元素)匹配的元素。 在这种情况下,它保留含有“a”的元素。 谓词作为lambda表达式给出;

  3. map() 操作转换 每个元素使用给定的函数,称为映射器。 在这种情况下,每个fruit String使用method-reference映射到将string字符串转换为大写版本String::toUppercase。

  Note 如果映射函数返回与其输入参数不同的类型,那么map()操作将返回具有不同泛型类型的流。 例如在一个Stream调用.map(String :: isEmpty)返回一个Stream

  4. sorted()操作对Stream的元素进行排序 根据它们的自然排序(根据在’String’的情况下对所在字典的顺序,其实都知道);

  5. 最后, forEach(action) 操作执行一个动作,作用于“Stream”的每个元素,将其传递给一个 Consumer。 在该示例中,每个元素只是被打印到控制台。 该操作是游戏终端操作,因此不可能再次进行操作。

  Note 在Stream中定义的操作之所以被执行,是因为最后有终端操作。 假如没有终端操作,’Stream’将不被处理,因为’Stream’输出不被任何终端操作使用(省的浪费计算资源,所以很多书上称之为被动式foreach)。

  操作(如上所示)链接在一起以形成可以被视为对数据的查询。

  一个Stream不能重复使用。 一旦调用任何中间或终端操作,“Stream”对象将变得不可用。 Stream代替地使用中间Stream对象,以便将中间操作链接在一起,通过一系列Stream操作来生成一个Stream对象作为中间对象,最后再调用这个生成的Stream对象来完成最终的操作,最后一步的操作只能进行一次,之后,此流已经没了(生命周期已结束)。

  Stream stream=

  Stream.of("d2", "a2", "b1", "b3", "c")

  .filter(s -> s.startsWith("a"));

  stream.anyMatch(s -> true); // The Stream has been used and is now consumed.

  stream.noneMatch(s -> true); // IllegalStateException; stream was already used

  Stream接口扩展了 AutoCloseable。Streams可以通过调用 close方法或使用try-with -resource语句来关闭。

  请注意,Stream通常不必关闭。仅需要关闭在IO通道上运行的流。 大多数Stream 型不对古玩资源操作,因此不需要关闭。

  Stream 应该关闭的示例用例是,当您从文件创建一个Stream 行时:

  try(final Stream lines=Files.lines(Paths.get("somePath"))){

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

  }

  Stream对象的处理可以是顺序或 parallel(并行)。

  在 sequential 模式中,按照“Stream”的源的顺序处理元素。 如果Stream是有序的(例如 SortedMap实现或List,处理过程保证匹配源的排序。 然而,在其他情况下,应注意不要依赖于顺序。

  List integerList=Arrays.asList(0, 1, 2, 3, 42);

  // sequential

  long howManyOddNumbers=integerList.stream()

  .filter(e -> (e % 2)==1).count();

  System.out.println(howManyOddNumbers); // Output: 2

  并行模式允许在多个核上使用多个线程,但不能保证处理元素的顺序。

  如果在顺序的 Stream 上虽然调用了多个方法,则不一定必须要调用每个方法。 例如,如果一个 Stream 被过滤,并且元素的数量减少到一,则不会发生对诸如sort的方法的后续调用。 这可以提高顺序的Stream的性能 - 这是一个并行的Stream不可能实现的优化。

  * Example:

  // parallel

  long howManyOddNumbersParallel=integerList.parallelStream()

  .filter(e -> (e % 2)==1).count();

  System.out.println(howManyOddNumbersParallel); // Output: 2

目录
相关文章
|
4月前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
119 0
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
83 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
1月前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
2月前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
43 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
2月前
|
Java Shell 流计算
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
25 1
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
|
3月前
|
存储 Java API
Java——Stream流详解
Stream流是JDK 8引入的概念,用于高效处理集合或数组数据。其API支持声明式编程,操作分为中间操作和终端操作。中间操作包括过滤、映射、排序等,可链式调用;终端操作则完成数据处理,如遍历、收集等。Stream流简化了集合与数组的操作,提升了代码的简洁性
111 11
Java——Stream流详解
|
2月前
|
存储 Java 数据处理
Flink-01 介绍Flink Java 3分钟上手 HelloWorld 和 Stream ExecutionEnvironment DataSet FlatMapFunction
Flink-01 介绍Flink Java 3分钟上手 HelloWorld 和 Stream ExecutionEnvironment DataSet FlatMapFunction
36 1
|
3月前
|
Java API C++
Java 8 Stream Api 中的 peek 操作
本文介绍了Java中`Stream`的`peek`操作,该操作通过`Consumer<T>`函数消费流中的每个元素,但不改变元素类型。文章详细解释了`Consumer<T>`接口及其使用场景,并通过示例代码展示了`peek`操作的应用。此外,还对比了`peek`与`map`的区别,帮助读者更好地理解这两种操作的不同用途。作者为码农小胖哥,原文发布于稀土掘金。
123 9
Java 8 Stream Api 中的 peek 操作
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
3月前
|
Java C# Swift
Java Stream中peek和map不为人知的秘密
本文通过一个Java Stream中的示例,探讨了`peek`方法在流式处理中的应用及其潜在问题。首先介绍了`peek`的基本定义与使用,并通过代码展示了其如何在流中对每个元素进行操作而不返回结果。接着讨论了`peek`作为中间操作的懒执行特性,强调了如果没有终端操作则不会执行的问题。文章指出,在某些情况下使用`peek`可能比`map`更简洁,但也需注意其懒执行带来的影响。
153 2
Java Stream中peek和map不为人知的秘密