Java8核心点

1,简介

1)synchronized多核cpu上,需要sync cpu高速缓存,需要进行内核间缓存一致性通信,代价很大。
2)新增Streams流处理函数式编程
【流处理】:java.util.stream中新增Stream的api。类似于linux命令处理流,并使用管道 | 连接起来。cat file1.txt file2.txt | grep "my word" | head -10,Streams可以更好的利用多核cpu,并行处理。
【函数式编程】:行为参数化,把代码传递给方法,允许将方法作为值。原先只能通过匿名类给方法传递函数功能。
方法引用语法 :: 例如 File::isHidden 会创建一个方法引用,进而作为值进行传递。
【接口默认方法】:接口可以包含实现类没有提供的方法,使用default关键字标名(必须由接口的实现类的实例,来调用这些默认方法)
【其它】:Lambda 匿名函数 与Optional避免null值。

image.png

3)外部迭代和内部迭代
使用for-each一个个迭代并处理元素,称为外部迭代迭代器模式,原集合remove时,会ConcurrentModificationException,使用iterator.remove可以避免。
使用Stream API在库内部进行迭代,称为内部迭代。

2,Lambda表达式

1)lambda匿名函数,有参数列表、函数主体、返回类型,还有可能抛出的异常列表
可以在函数式接口上使用lambda表达式
2)语法表达式可以隐式返回;语句必须主动return
(parameters) -> expression 或者 (parameters) -> { statements; } 注意花括号和语句结尾符;
(String s) -> s.length()
(Apple a) -> a.getWeight() > 10
(int x, int y) -> {
System.out.println("x:" + x);
System.out.println("y:" + y);
}
() -> "result"
(Apple a, Apple b) -> a.getWeight().compareTo(b.getWeight())
当只有一个参数,且其类型可推导时,圆括号()可省略。如: a -> return a*a
3)lambda和匿名内部类方法作为值

image.png

4)lambda表达式:可以赋值给一个变量作为参数传递一个一个接受函数式接口的方法(lambda表达式的签名,需要与函数式接口的默认方法的签名一致)。
函数描述符(签名):() -> void 表示参数为空,返回值为void的函数签名
(Apple a, Apple b) -> int 表示接受两个Apple作为参数,返回int的函数签名
5)在支持一类函数的语言中,Lambda 表达式的类型是函数;在 Java 中,Lambda 表达式是对象,他们必须依附于一类特别的对象类型——函数式接口(functional interface)
6)lambda与匿名内部类的区别
1.对于this关键字,匿名内部类解析为内部类;lambda表达之解析为lambda的外部类。
2.java编译器将lambda表达式转换类类的私有函数;匿名内部类编译为.class文件。

3,函数式接口

1)定义: 只定义了一个抽象方法的接口,使用了@FunctionalInterface注解()。如java.lang.Runnable、java.util.concurrent.Callable
函数描述符:函数式接口的抽象方法的签名(方法名+形参列表)。
2)java.util.function.Predicate
functional interface函数式接口,函数方法:参数泛型,返回boolean值( 输入的对象是否 符合某个条件)
函数描述符:boolean test(T t) 接受泛型参数,返回boolean值。

image.png

image.png

3)java.util.function.Consumer
funtional interface函数式接口,函数方法:参数泛型,返回值void(需要访问T,并对其执行某些操作时使用。)
image.png

image.png

4)java.utils.function.Function
接受一个参数,产出一个结果,两者类型可能不同
image.png

image.png

4,方法引用

1)重复使用现有方法的定义,可以看做lambda表达式的语法糖,使用::

2)方法引用的类型不需要(),因为并没有实际调用
指向类的静态方法的引用Integer::parseInt
指向类的实例方法的引用String::length
指向对象的实例方法的引用myService.query(userId)
3)引用类型和lambda的对应

image.png

你可能感兴趣的:(Java8核心点)