1、Java8的新特性Lambda
C# .where(m=>m.id=1)
Java ->
Lambda表达式(也称为闭包)是Java 8中最大和最令人期待的语言改变。
语法:形参列表 -> 主体部分 ([Type var1 .....])->{ 代码块 }
形参列表:传入主体部分的形参
基本格式:(Type1 var1,Type2 var2,....,TypeN varN) ;以逗号分隔,以()包围
形参类型可推断:如果参数的类型可以根据上下文推断出来,则可以省略掉类型
很多时候形参列表的写法为: (var1,var2,...,varN) ;
单个形参时可以省略 (),例如:e->System.out.println(e);
没有形参参数时,语法格式为:()->主体部分;
->:Lambda表达式的固定写法;
主体部分:
- 主体部分可以单个语句或代码块(使用大括号包裹);
- 如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值
格式示例(无法直接运行):
() -> 1; // 无参数,返回
1 x -> x ; // 1个参数,直接返回
(x, y) -> x – y // 2个参数(数字),并返回他们的差
(int x, int y) -> x + y //2个int型整数,返回和
(String s) -> System.out.print(s) // 一个string参数,并在控制台打印,不返回任何值(看起来像是返回void)
2、函数式接口(Functional Interface)
函数式接口(Functional Interface)是指:一个有且仅有一个抽象方法,但是可以有多个非抽象方法(主要是默认方法和静态方法)的接口
函数式接口可以被隐式转换为Lambda表达式
Java8之前的函数式接口有:
- 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
Java8新加的函数式接口(java.util.function包)
分类 | 接口 | 等价方法 | 描述 |
基础形态 | BinaryOperator<T> | 代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果 | |
Consumer<T> | 代表了接受一个输入参数并且无返回的操作 | ||
Function<T,R> | 接受一个输入参数,返回一个结果。 | ||
Predicate<T> | 接受一个输入参数,返回一个布尔值结果。 | ||
Supplier<T> | 无参数,返回一个结果。 | ||
双参 | BiConsumer<T,U> | 代表了一个接受两个输入参数的操作,并且不返回任何结果 | |
BiFunction<T,U,R> | 代表了一个接受两个输入参数的方法,并且返回一个结果 | ||
BiPredicate<T,U> | 代表了一个两个参数的boolean值方法 | ||
布尔相关变形 | BooleanSupplier | Supplier<Boolean> | 代表了boolean值结果的提供方 |
Double相关变形 | DoubleBinaryOperator | BinaryOperator<Double> | 代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。 |
DoubleConsumer | Consumer<Double> | 代表一个接受double值参数的操作,并且不返回结果。 | |
DoubleFunction<R> | Function<Double,R> | 代表接受一个double值参数的方法,并且返回结果 | |
DoublePredicate | Predicate<Double> | 代表一个拥有double值参数的boolean值方法 | |
DoubleSupplier | Supplier<Double> | 代表一个double值结构的提供方 | |
DoubleToIntFunction | Function<Double,Integer> | 接受一个double类型输入,返回一个int类型结果。 | |
DoubleToLongFunction | Function<Double,Long> | 接受一个double类型输入,返回一个long类型结果 | |
DoubleUnaryOperator | UnaryOperator<Double> | 接受一个参数同为类型double,返回值类型也为double 。 | |
Int相关变形 | IntBinaryOperator | BinaryOperator<Integer> | 接受两个参数同为类型int,返回值类型也为int 。 |
IntConsumer | Consumer<Integer> | 接受一个int类型的输入参数,无返回值 。 | |
IntFunction<R> | Function<Int,R> | 接受一个int类型输入参数,返回一个结果 。 | |
IntPredicate | Predicate<Integer> | 接受一个int输入参数,返回一个布尔值的结果。 | |
IntSupplier | Supplier<Integer> | 无参数,返回一个int类型结果。 | |
IntUnaryOperator | UnaryOperator<Integer> | 接受一个参数同为类型int,返回值类型也为int 。 | |
IntToDoubleFunction | Function<Integer,Double> | 接受一个int类型输入,返回一个double类型结果 。 | |
IntToLongFunction | Function<Integer,Long> | 接受一个int类型输入,返回一个long类型结果。 | |
Long相关变形 | LongBinaryOperator | BinaryOperator<Long> | 接受两个参数同为类型long,返回值类型也为long。 |
LongConsumer | Consumer<Long> | 接受一个long类型的输入参数,无返回值。 | |
LongFunction<R> | Function<Long,R> | 接受一个long类型输入参数,返回一个结果。 | |
LongPredicate<R> | Predicate<Long> | 接受一个long输入参数,返回一个布尔值类型结果。 | |
LongSupplier | Supplier<Long> | 无参数,返回一个结果long类型的值。 | |
LongUnaryOperator | UnaryOperator<Long> | 接受一个参数同为类型long,返回值类型也为long。 | |
LongToDoubleFunction | Function<Long,Double> | 接受一个long类型输入,返回一个double类型结果。 | |
LongToIntFunction | Function<Long,Integer> | 接受一个long类型输入,返回一个int类型结果。 | |
Consumer双参变形 | ObjDoubleConsumer<T> | BiConsumer<T,Double> | 接受一个object类型(泛型T)和一个double类型的输入参数,无返回值。 |
ObjIntConsumer<T> | BiConsumer<T,Integer> | 接受一个object类型(泛型T)和一个int类型的输入参数,无返回值。 | |
ObjLongConsumer<T> | BiConsumer<T,Long> | 接受一个object类型(泛型T)和一个long类型的输入参数,无返回值。 | |
转Double相关变形 | ToDoubleBiFunction<T,U> | BiFunction<T,U,Double> | 接受两个输入参数,返回一个double类型结果 |
ToDoubleFunction<T> | Function<T,Double> | 接受一个输入参数,返回一个double类型结果 | |
转Int相关变形 | ToIntBiFunction<T,U> | BiFunction<T,U,Integer> | 接受两个输入参数,返回一个int类型结果。 |
ToIntFunction<T> | Function<T,Integer> | 接受一个输入参数,返回一个int类型结果。 | |
转Long相关变形 | ToLongBiFunction<T,U> | BiFunction<T,U,Long> | 接受两个输入参数,返回一个long类型结果。 |
ToLongFunction<T> | Function<T,Long> | 接受一个输入参数,返回一个long类型结果。 |
3、接口默认方法和静态方法
Java 8使用两个新概念扩展了接口的含义:默认方法和静态方法。
默认方法:默认方法使开发者可以在 不破坏二进制兼容性的前提下,往现存接口中添加新的方法,即不强制那些实现了该接口的类也同时新加了方法。
默认方法和抽象方法之间的区别在于抽象方法需要实现,而默认方法不需要。接口提供的默认方法会被接口的实现类继承或者覆写。
静态方法: 在接口中可以定义静态方法
4、方法引用
方法引用通过方法的名字来指向一个方法。
方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
方法引用使用一对冒号 :: 。
有些情况下,用Lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作,在这种情况下,我们倾向于通过方法名来调用它,而Lambda表达式可以帮助我们实现这一要求,它使得Lambda在调用那些已经拥有方法名的方法的代码更简洁、更容易理解。方法引用可以理解为Lambda表达式的另外一种表现形式。
返回值类型 | 方法名称 | 说明 |
Throwable | fillInStackTrace() | 在异常堆栈跟踪中填充 |
Throwable | getCause() | 返回此 throwable 的 cause;如果 cause 不存在或未知,则返回 null |
String | getLocalizedMessage() | 创建此 throwable 的本地化描述 |
String | getMessage() | 返回此 throwable 的详细消息字符串 |
StackTraceElement[] | getStackTrace() | 提供编程访问由 printStackTrace() 输出的堆栈跟踪信息 |
Throwable | initCause(Throwable cause) | 将此 throwable 的 cause 初始化为指定值 |
void | printStackTrace() | 将此 throwable 及其追踪输出至标准错误流 |
以上就是我的分享,请多多指教。如果有更好的方法或不懂得地方欢迎在评论区教导和提问喔!