Java函数式编程:三、流与函数式编程( 三 )

类中加入了一个新方法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}的流}

经验总结扩展阅读