Java8是2014年宣布的,至今也已经有快三年的时间了,之前固然有进修过,可是学的较量零星,不成系统,并且也没有包围到Java8所有的特性。 由于公司已经利用了JDK1.8,所以事情中能利用Java8的时机照旧许多的,因此抉择来系统地进修一下Java8的新特性,这是对我最近进修Java8的一些记录, 以备在有些细节记不太清的时候可以查询。
先来一个概览,上图是我整理的Java8中的新特性,总的来看,大抵上可以分成这么几个大块。
函数式接口
所谓的函数式接口就是只有一个抽象要领的接口,留意这里说的是抽象要领,因为Java8中插手了默认要领的特性,可是函数式接口是不体贴接口中有没有默认要领的。 一般函数式接口可以利用@FunctionalInterface
注解的形式来标注暗示这是一个函数式接口,该注解标注与否对函数式接口没有实际的影响, 不外一般照旧推荐利用该注解,就像利用@Override
注解一样。JDK1.8中提供了一些函数式接口如下:
函数式接口 | 函数描写符 | 原始范例特化 |
---|---|---|
Predicate<T> |
T -> boolean | IntPredicate, LongPredicate, DoublePredicate |
Consumer<T> |
T -> void | IntConsumer, LongConsumer, DoubleConsumer |
Function<T,R> |
T -> R | IntFunction<R>, IntToDoubleFunction, IntToLongFunction, LongFunction<R>, LongToDoubleFunction, LongToIntFunction, DoubleFunction<R>, ToIntFunction<T>, ToDoubleFunction<T>, ToLongFunction<T> |
Supplier<T> |
() -> T | BooleanSupplier, IntSupplier, LongSupplier, DoubleSupplier |
UnaryOperator<T> |
T -> T | IntUnaryOperator, LongUnaryOperator, DoubleUnaryOperator |
BinaryOperator<T> |
(T,T) -> T | IntBinaryOperator, LongBinaryOperator, DoubleBinaryOperator |
BiPredicate<L,R> |
(L,R) -> boolean | |
BiConsumer<T,U> |
(T,U) -> void | ObjIntConsumer<T>, ObjLongConsumer<T>, ObjDoubleConsumer<T> |
BiFunction<T,U,R> |
(T,U) -> R | ToIntBiFunction<T,U>, ToLongBiFunction<T,U>, ToDoubleBiFunction<T,U> |
上表中的原始范例特化指的是为了消除自动装箱和拆箱的机能开销,JDK1.8提供的针对根基范例的函数式接口。
Lambda表达式和要领引用
有了函数式接口之后,就可以利用Lambda表达式和要领引用了。其实函数式接口的表中的函数描写符就是Lambda表达式,在函数式接口中Lambda表达式相当于匿名内部类的结果。 举个简朴的例子:
public class TestLambda { public static void execute(Runnable runnable) { runnable.run(); } public static void main(String[] args) { //Java8之前 execute(new Runnable() { @Override public void run() { System.out.println("run"); } }); //利用Lambda表达式 execute(() -> System.out.println("run")); } }
可以看到,对比于利用匿名内部类的方法,Lambda表达式可以利用更少的代码可是有更清晰的表述。留意,Lambda表达式也不是完全等价于匿名内部类的, 两者的差异点在于this
的指向和当地变量的屏蔽上。
Lambda表达式还可以复合,把几个Lambda表达式串起来利用:
Predicate<Apple> redAndHeavyApple = redApple.and(a -> a.getWeight() > 150).or(a -> “green”.equals(a.getColor()));
上面这行代码把两个Lambda表达式串了起来,寄义是选择重量大于150可能绿色的苹果。
要领引用可以看作Lambda表达式的更简捷的一种表达形式,利用::
操纵符,软件开发,要领引用主要有三类:
Integer::parseInt
);String::length
);localVariable::getValue
)。