项目实例

https://github.com/Emily0511/LambdaStream
学习来源:
https://zhuanlan.zhihu.com/p/28112239
JDK8为我们提供了一些便捷的Stream相关 类库:
image.png

流操作

java.util.stream.Stream中定义了许多流操作的方法,为了更好的理解Stream API掌握它常用的操作非常重要。
流的操作其实可以分为两类:处理操作聚合操作

  • 处理操作:诸如filter、map等处理操作将Stream一层一层的进行抽离,返回一个流给下一层使用。
  • 聚合操作:从最后一次流中生成一个结果给调用方,foreach只做处理不做返回。

    filter:

    filter看名字也知道是过滤的意思,我们通常在筛选数据的时候用到,频率非常高。
    filter方法的参数是Predicate predicate 即一个从 T 到 boolean 的函数。
    image.png

    map:

    有时候我们需要将流中处理的数据类型进行转换,这时候就可以使用map方法来完成,将流中的值转换为一个新的流。image.png

    flatMap:

    有时候我们会遇到提取子流的操作,这种情况用的不多但是遇到flatMap将变成更容易处理。
    image.png
    例如我们有一个List>结构的数据:
    1. List<List<String>> lists = new ArrayList<>();
    2. lists.add(Arrays.asList("apple", "click"));
    3. lists.add(Arrays.asList("boss", "dig", "qq", "vivo"));
    4. lists.add(Arrays.asList("c#", "biezhi"));
    要做的操作是获取这些数据中长度大于2的单词个数
    1. lists.stream()
    2. .flatMap(Collection::stream)
    3. .filter(str -> str.length() > 2)
    4. .count();
    在不使用flatMap前你可能需要做2次for循环。这里调用了List的stream方法将每个列表转换成Stream对象,
    其他的就和之前的操作一样。

    并行数据处理

    并行和并发

    并发是两个任务共享时间段,并行则是两个任务在同一时间发生,比如运行在多核CPU上。
    如果一个程序要运行两个任务,并且只有一个CPU给它们分配了不同的时间片,那么这就是并发,而不是并行。

    并行化是指为缩短任务执行时间,将一个任务分解成几部分,然后并行执行。

这和顺序执行的任务量是一样的,区别就像用更多的马来拉车,花费的时间自然减少了。
实际上,和顺序执行相比,并行化执行任务时,CPU承载的工作量更大。

数据并行化是指将数据分成块,为每块数据分配单独的处理单元。

还是拿马拉车那个例子打比方,就像从车里取出一些货物,放到另一辆车上,两辆马车都沿着同样的路径到达目的地。
当需要在大量数据上执行同样的操作时,数据并行化很管用。
它将问题分解为可在多块数据上求解的形式,然后对每块数据执行运算,最后将各数据块上得到的结果汇总,从而获得最终答案。
人们经常拿任务并行化和数据并行化做比较,在任务并行化中,线程不同,工作各异。
我们最常遇到的JavaEE应用容器便是任务并行化的例子之一,每个线程不光可以为不同用户服务,
还可以为同一个用户执行不同的任务,比如登录或往购物车添加商品。

Stream并行流

流使得计算变得容易,它的操作也非常简单,但你需要遵守一些约定。默认情况下我们使用集合的stream方法
创建的是一个串行流,你有两种办法让他变成并行流。

  1. 调用Stream对象的parallel方法
  2. 创建流的时候调用parallelStream而不是stream方法