Java8核心点
1,简介
1)synchronized多核cpu上,需要
image.pngsync cpu高速缓存
,需要进行内核间缓存一致性通信
,代价很大。
2)新增Streams流处理
、函数式编程
。
【流处理】:java.util.stream
中新增Stream<T>的api。类似于linux命令处理流,并使用管道 | 连接起来。cat file1.txt file2.txt | grep "my word" | head -10
,Streams可以更好的利用多核cpu,并行处理。
【函数式编程】:行为参数化,把代码传递给方法,允许将方法作为值。原先只能通过匿名类给方法传递函数功能。
方法引用语法:: 例如 File::isHidden 会创建一个方法引用,进而作为值进行传递。
【接口默认方法】:接口可以包含实现类没有提供的方法,使用default关键字标名
【其它】:Lambda匿名函数
与Optional<T>避免null值。
3)外部迭代和内部迭代
使用for-each
一个个迭代并处理元素,称为外部迭代迭代器模式,原集合remove时,会ConcurrentModificationException,使用iterator.remove可以避免。
。
使用Stream API
在库内部进行迭代,称为内部迭代。
2,Lambda表达式
1)lambda匿名函数,有
image.png参数列表、函数主体、返回类型,还有可能抛出的异常列表
。
可以在函数式接口上使用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和匿名内部类方法作为值
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)定义:
image.png只定义了一个抽象方法的接口,使用了@FunctionalInterface注解()。如java.lang.Runnable、java.util.concurrent.Callable
函数描述符:函数式接口的抽象方法的签名(方法名+形参列表)。
2)java.util.function.Predicate
functional interface函数式接口,函数方法:参数泛型,返回boolean值( 输入的对象是否 符合某个条件)
函数描述符:boolean test(T t) 接受泛型参数,返回boolean值。
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的对应