JDK1.8新特性
Lambda表达式函数式接口*方法引用和构造器调用Stream API接口中的默认方法和静态方法新时间日期APILambda表达式Lambda表达式作为Java8语法糖,允许将函数作为参数传入到方法中,但是被传入的函数必须是函数式接口。Lambda表达式语法:() -> ();前置语法无参数无返回值() -> System.out.println(“Hello WOrld”)有一个参数
- Lambda表达式
- 函数式接口
- *方法引用和构造器调用
- Stream API
- 接口中的默认方法和静态方法
- 新时间日期API
- 并行和串行
- 其它
Lambda表达式
Lambda表达式作为Java8语法糖,允许将函数作为参数传入到方法中,但是被传入的函数必须是函数式接口。
Lambda表达式语法:() -> ();
前置 | 语法 |
无参数无返回值 | () -> System.out.println(“Hello WOrld”) |
有一个参数无返回值 | (x) -> System.out.println(x) |
有且只有一个参数无返回值 | x -> System.out.println(x) |
有多个参数,有返回值,有多条lambda体语句 | (x,y) -> {System.out.println(“xxx”);return xxxx;}; |
有多个参数,有返回值,只有一条lambda体语句 | (x,y) -> xxxx |
函数式接口
让我们来看看函数式接口的定义:有且仅有一个抽象方法但可以有多个非抽象方法的接口。这里强调只能有一个抽象方法含义是使用Lambda表达式时如果有多个抽象方法,编译器不知道该选哪个抽象方法。注解@FunctionalInterface用于标识函数式接口。
java1.8之前的函数式接口:
- java.lang.Runnable
- java.util.concurrent.Callable
- java.security.PrivilegedAction
- java.util.Comparator
- java.io.FileFilter
- java.nio.file.PathMatcher
- java.lang.reflect.InvocationHandler
- java.beans.PropertyChangeListener
- java.awt.event.ActionListener
- javax.swing.event.ChangeListener
java1.8引入了java.util.function包,其中包含了很多函数式接口。这些函数式接口的定义基本上能满足我们日常使用。
序号
接口 & 描述
1
BiConsumer<T,U>
代表了一个接受两个输入参数的操作,并且不返回任何结果
2
BiFunction<T,U,R>
代表了一个接受两个输入参数的方法,并且返回一个结果
3
BinaryOperator<T>
代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果
4
BiPredicate<T,U>
代表了一个两个参数的boolean值方法
5
BooleanSupplier
代表了boolean值结果的提供方
6
Consumer<T>
代表了接受一个输入参数并且无返回的操作
7
DoubleBinaryOperator
代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。
8
DoubleConsumer
代表一个接受double值参数的操作,并且不返回结果。
9
DoubleFunction<R>
代表接受一个double值参数的方法,并且返回结果
10
DoublePredicate
代表一个拥有double值参数的boolean值方法
11
DoubleSupplier
代表一个double值结构的提供方
12
DoubleToIntFunction
接受一个double类型输入,返回一个int类型结果。
13
DoubleToLongFunction
接受一个double类型输入,返回一个long类型结果
14
DoubleUnaryOperator
接受一个参数同为类型double,返回值类型也为double。
15
Function<T,R>
接受一个输入参数,返回一个结果。
16
IntBinaryOperator
接受两个参数同为类型int,返回值类型也为int 。
17
IntConsumer
接受一个int类型的输入参数,无返回值。
18
IntFunction<R>
接受一个int类型输入参数,返回一个结果。
19
IntPredicate
:接受一个int输入参数,返回一个布尔值的结果。
20
IntSupplier
无参数,返回一个int类型结果。
21
IntToDoubleFunction
接受一个int类型输入,返回一个double类型结果。
22
IntToLongFunction
接受一个int类型输入,返回一个long类型结果。
23
IntUnaryOperator
接受一个参数同为类型int,返回值类型也为int 。
24
LongBinaryOperator
接受两个参数同为类型long,返回值类型也为long。
25
LongConsumer
接受一个long类型的输入参数,无返回值。
26
LongFunction<R>
接受一个long类型输入参数,返回一个结果。
27
LongPredicate
R接受一个long输入参数,返回一个布尔值类型结果。
28
LongSupplier
无参数,返回一个结果long类型的值。
29
LongToDoubleFunction
接受一个long类型输入,返回一个double类型结果。
30
LongToIntFunction
接受一个long类型输入,返回一个int类型结果。
31
LongUnaryOperator
接受一个参数同为类型long,返回值类型也为long。
32
ObjDoubleConsumer<T>
接受一个object类型和一个double类型的输入参数,无返回值。
33
ObjIntConsumer<T>
接受一个object类型和一个int类型的输入参数,无返回值。
34
ObjLongConsumer<T>
接受一个object类型和一个long类型的输入参数,无返回值。
35
Predicate<T>
接受一个输入参数,返回一个布尔值结果。
36
Supplier<T>
无参数,返回一个结果。
37
ToDoubleBiFunction<T,U>
接受两个输入参数,返回一个double类型结果
38
ToDoubleFunction<T>
接受一个输入参数,返回一个double类型结果
39
ToIntBiFunction<T,U>
接受两个输入参数,返回一个int类型结果。
40
ToIntFunction<T>
接受一个输入参数,返回一个int类型结果。
41
ToLongBiFunction<T,U>
接受两个输入参数,返回一个long类型结果。
42
ToLongFunction<T>
接受一个输入参数,返回一个long类型结果。
43
UnaryOperator<T>
接受一个参数为类型T,返回值类型也为T。
方法引用
方法引用通过方法的名字来指向方法,使用一对冒号 :: 进行标识。
我们用Lambda表达式来实现匿名方法。但有些情况下,我们用Lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作,它使得Lambda在调用那些已经拥有方法名的方法的代码更简洁、更容易理解。方法引用可以理解为Lambda表达式的另外一种表现形式。
方法引用的四种方式:
- 构造方法引用 格式:Class::new(调用默认无参构造函数)
- 类静态方法引用 格式:Class::static_method
- 类普通方法引用 格式:Class::method
- 实例方法引用 格式:instance::method
StreamAPI
StreamAPI更详细文章在下方文章
https://blog.csdn.net/w8827130/article/details/122764087
接口中的默认方法和静态方法
jdk1.7中接口是只能存在抽象方法,而jdk1.8中可以定义默认实现方法和静态方法。使用Inteface我们能实现面向接口编程,但是接口在实际开发过程中也是有短板的,如在老接口中新增抽象方法,那实现其接口的类都要实现新增的抽象方法,对原有的类影响过大。所以引入了default默认实现,static的用法是直接用接口名调用方法。
public interface TestInteface{
default String getName(){
return "zhangsan";
}
static String getName2(){
return "zhangsan";
}
}
当一个类继承父类又实现接口时,若后两者方法名相同,则优先继承父类中的同名方法,即“类优先”,如果实现两个同名方法的接口,则要求实现类必须手动声明默认实现哪个接口中的方法。如下使用AInterface.super.getName()。
public interface AInterface {
default String getName(){
return "A";
}
}
public interface BInterface {
default String getName(){
return "B";
}
}
public class DClass implements AInterface, BInterface {
public String getName() {
return AInterface.super.getName();
}
}
其它
Optional容器
Optional可以在编译期间检测出NullPointException,避免了运行过程中再出现的问题。
Optional.of(T t); // 创建一个Optional实例,但是Optional.of(null)会直接报空指针
Optional.empty(); // 创建一个空的Optional实例
Optional.ofNullable(T t); // 若T不为null,创建一个Optional实例,否则创建一个空实例
isPresent(); // 判断是够包含值
orElse(T t); //如果调用对象包含值,返回该值,否则返回T
orElseGet(Supplier s); // 如果调用对象包含值,返回该值,否则返回s中获取的值
map(Function f): // 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty();
flatMap(Function mapper);// 与map类似。返回值是Optional
参考文章:
更多推荐
所有评论(0)