类中加入了一个新方法splitAsStream()
, 该方法接受一个字符序列并可以根据我们传入的公式将其分拆为一个流 。
要注意的是 , 这个地方的输入不能直接是一个流 , 必须得是一个CharSequence
String s = "abcdefg";Pattern.compile("[be]").splitAsStream(s).map(x -> x+"?").forEach(System.out::print);// 输出a?cd?fg?
2、中间操作我们获取了流 , 那么我们要做什么呢?显然 , 我们希望逐个对流中的数据进行操作 , 我们有以下方式可选:
- 查看元素
peek()
- 对元素排序
sorted()
sorted(Comparator compa)
- 移除元素
distinct()
filter(Predicate)
- 将函数应用于每个元素
map(Function func)
mapToInt(ToIntFunction func)
mapToLong(ToLongFunction func)
mapToDouble(ToDoubleFunction func)
- 应用函数期间组合流
flatMap(Function func)
flatMapToInt(ToIntFunction func)
flatMapToLong(ToLongFunction func)
flatMapToDouble(ToDoubleFunction func)
主要就是
peek()
, 它允许我们在不做任何操作的情况下查看流中的所有元素 , 其意义在于我们可以通过它来跟踪和调试我们的流代码 , 当你不知道你的代码中 , 这些流元素究竟被变成了什么样子的话 , 可以使用这个方法而不是forEach()
来终止流 。对元素排序
sorted()
方法 , 同样很好理解 , 如果你不给Comparator
作为参数 , 那么就是一个很普通的排序方法 , 类似Arrays.sort()
这样 , 你可以查看源码来看看默认顺序究竟如何 。不过更可靠的方法是我们自己来实现一个
Comparator
来操控整个流的比较结果 。移除元素
主要有两种方法 , 分别是
distinct()
和filter
二者都很好用 , distinct()
可以消除那些重复的元素 , 这比通过Set
来获取元素要便捷得多 。而
filter(Predicate)
更是全能 , 该方法需要以一个返回值为布尔的方法为变量 , 它会负责抛弃那些返回值为false
的方法 , 留下那些返回值为true
的方法 , 可以大大降低我们的代码量 。将函数应用于各个元素
主要就是
map(Function func)
, 其他三个方法只是返回值变为对应的基本类型流而已 , 主要是为了提高效率 。我们需要提供一个能够处理流中元素并返回新值的方法 , 随后该方法就会将我们提供的参数方法应用于每个元素上 , 十分方便在应用map()期间组合流
flatMap()
, 其实和map()
的区别就是 , 有时候我们提供的参数方法会返回一个流而不是一个元素 。这样的话 , 我们就需要另一个方法能够以流为参数进行处理 , 也就是需要一个方法把我们返回的流平展开成为元素 , 类似于把所有返回的流拼接在一起 , 成为一个更大的流然后再进行处理 。一个典型的例子:
public static void main(String[] args){Stream.of(1, 2, 3).flatMap(i -> Stream.of('a', 'b', 'c')).forEach(System.out::println);// 上面的flatMap()处如果使用map()那么会返回三个元素为{a, b, c}的流// 而如果是faltMap()则返回的是元素为{a, b, c, a, b, c, a, b, c}的流}
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 2022,一个Java程序猿的外设配置
- 2022,一个Java程序猿的装机配置
- Java 多线程写zip文件遇到的错误 write beyond end of stream!
- 1 JAVA语言学习-面向对象
- 函谷关在哪里
- Java 19 新功能介绍
- Java线程未捕获异常处理 UncaughtExceptionHandler
- 死磕面试系列,Java到底是值传递还是引用传递?
- 【Java复健指南09】项目练习全解--房屋出租系统
- Java集合精选常见面试题