jdk1.8学习笔记

来源:[英]厄马(Raoul-Gabriel Urma)[意] 弗斯科(Mario Fusco)[英] 米克罗夫特(Alan Mycroft). Java 8实战 (图灵程序设计丛书) (Kindle 位置 1022-1028). 人民邮电出版社. Kindle 版本.

1.行为参数化:

将一个代码块作为另一个方法的参数(实现:匿名内部类)

GUI编程:执行一个操作来响应特定事件(类似与观察者模式)

  • 行为参数化,就是一个方法 接受 多个不同的行为作为参数,并在内部使用它们, 完成 不同行为的能力。
  • 行为参数化可让代码更好地适应不断变化的要求,减轻未来的工作量。
  • 传递代码,就是将新行为作为参数传递给方法。但在Java 8之前这实现起来很啰嗦。为接口声明许多只用一次的实体类而造成的啰嗦代码,在Java
    8之前可以用匿名类来减少。
  • Java API包含很多可以用不同行为进行参数化的方法,包括排序、线程和GUI处理。

2.lamdba

语法:主体可以使用{}以实现多行,并支持增加返回值
在这里插入图片描述
lamdba表达式实际表示一个函数式接口【@FunctionalInterface】(只有一个抽象方法的接口)的匿名实现
jdk提供的函数式接口:3.4.1 Predicate 3.4.2 Consumer 3.4.3 Function
在这里插入图片描述
在这里插入图片描述

方法引用:对特定lambda的一种特定写法
示例:inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));
等价于:inventory.sort(comparing(Apple::getWeight));

3.流:

经测试适用于流的场景:1.执行的内容需要耗时较长 2.遍历次数较大
否则效率并没有普通for循环或foreach的效率高

流可以使代码类似于使用sql一样,对集合进行筛选排序等。

List<String> lowCaloricDishesName = menu.stream()
    .filter(d -> d.getCalories() < 400)    ←─选出400卡路里以下的菜肴 
    .sorted(comparing(Dish::getCalories))    ←─按照卡路里排序
    .map(Dish::getName)    ←─提取菜肴的名称 
    .collect(toList());    ←─将所有名称保存在List中 
    //为了利用多核架构并行执行这段代码,你只需要把stream() 换成 parallelStream() : 
List<String> lowCaloricDishesName = menu.parallelStream()
    .filter(d -> d.getCalories() < 400) 
    .sorted(comparing(Dishes::getCalories))
    .map(Dish::getName) 
    .collect(toList());
    /**
并行流:menu.parallelStream()
串行:menu.stream()
    **/

3.1流只能被遍历一次
3.2流的中间操作都是在最后一步(终端操作:返回不是流的操作)一次完成的,延时执行;以上为例,collect时候才会迭代并使用以上条件,这个collect即为终端操作
3.3map/flatMap

  • Streams API可以表达复杂的数据处理查询。常用的流操作总结在表5-1中。

  • 你可以使用filter 、 distinct 、 skip 和 limit对流做筛选和切片。

  • 你可以使用map 和 flatMap提取或转换流中的元素。

  • 你可以使用findFirst 和 findAny方法查找流中的元素。

  • 你可以用allMatch 、 noneMatch 和 anyMatch方法让流匹配给定的谓词。

  • 这些方法都利用了短路:找到结果就立即停止计算;没有必要处理整个流。

  • 你可以利用reduce方法将流中所有的元素迭代合并成一个结果,例如求和或查找最大元素。

  • filter 和 map等操作是无状态的,它们并不存储任何状态。reduce等操作要存储状态才能计算出一个值。sorted 和
    distinct等操作也要存储状态,因为它们需要把流中的所有元素缓存起来才能返回一个新的流。这种操作称为有状态操作 。

  • 流有三种基本的原始类型特化:IntStream 、 DoubleStream 和 LongStream。它们的操作也有相应的特化。

  • 流不仅可以从集合创建,也可从值、数组、文件以及iterate 与 generate等特定方法创建。

  • 无限流是没有固定大小的流。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • collect是一个终端操作,它接受的参数是将流中元素累积到汇总结果的各种方式(称为收集器)。

  • 预定义收集器包括将流元素归约和汇总到一个值,例如计算最小值、最大值或平均值。这些收集器总结在表6-1中。

  • 预定义收集器可以用groupingBy对流中元素进行分组,或用partitioningBy进行分区。

  • 收集器可以高效地复合起来,进行多级分组、分区和归约。

  • 你可以实现Collector接口中定义的方法来开发你自己的收集器。

待补充。。。

4.并行流

5.Optional

6.CompletableFuture:组合式异步编程

7.新的日期和时间API

8.函数式编程

jdk1.7:

分支/合并框架:分支/合并框架的目的是以递归方式将可以并行的任务拆分成更小的任务,然后将每个子任务的结果合并起来生成整体结果。它是ExecutorService接口的一个实现,它把子任务分配给线程池(称为ForkJoinPool)中的工作线程。首先来看看如何定义任务和子任务。

jdk1.8:

  1. 注解的升级
    2.类库的升级
发布了43 篇原创文章 · 获赞 3 · 访问量 7760

猜你喜欢

转载自blog.csdn.net/u013523089/article/details/91597777
今日推荐