概述
lambda表达式, 是Java8中的一个新特性。能够理解为一个匿名函数。java
lambda表达式能够理解为将一个函数浓缩为一行代码,使代码更加简洁紧凑。编程
lambda表达式语法:函数式编程
(parameters) -> statement;函数
或this
(parameters) -> {statements;}线程
参数以下:对象
- parameters:参数, 能够指定或不指定参数类型, 当只有一个参数时能够不要圆括号
- statement:函数返回值,直接返回该值,无需大括号
- statements:函数体,当使用大括号时须要指明表达式返回的值
lambda表达式实例:blog
// 无参,返回5
() -> 5;
// 接收参数x,返回2*x
x -> 2 * x;
// 接收参数x y, 返回x+y
(x, y) -> x + y;
// 指明接收参数类型
(int x, int y) -> x + y;
// 接收字符串并打印,无返回值
(String s) -> System.out.print(s);
// 包括函数体
(String s) -> {
System.out.print(s);
return s;
};
Java中使用lambda表达式
在Python中是有的。可是Python中万物皆对象,直接将函数赋值给一个变量便可,那么在Java中该如何使用lambda表达式呢?接口
运行结果字符串
能够看出lambda表达式实质是实现了接口中的方法,怎么感受向匿名内部类呢?
lambda表达式与匿名内部类的区别:
- this关键字。匿名内部类中的this指当前匿名类,lambda表达式中的this指lambda的外部类。
FunctionInterface注解:
@ FunctionInterface 是Java8中新加入的接口, 用于指明该接口是根据Java语言规范定义的函数式接口。例如以下代码:
@FunctionInterface
public interface MathOperation{
public int operation(int a, int b);
}
若在接口中加入更多的抽象方法, 将抛出编译错误。
lambda表达式中的变量
这样看没什么毛病,可是要想在后面修改该字符串,问题就来了
能够看到,lambda表达式使用的外部的局部变量必须是final的,那么成员变量呢?
成员变量以及静态变量可使用,并在以后进行修改,至于缘由能够看个人这篇文章
Java 内部类
Java中lambda表达式举例
那么Java中引入lambda表达式能够带来怎样的便利呢?经过下面几个例子能够看一看:
1.建立线程
2.遍历list
固然还有不少,能够本身尝试
Java8 函数式接口
函数式接口就是一个有且仅有一个抽象方法, 但能够有多个非抽象方法的接口.
函数式接口很好的支持了lambda表达式。
JDK1.8以前以有的函数式接口:
- java.lang.Runable
- 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
JDK1.8新增的函数式接口:
java.util.function 包下包含了不少类,用来支持Java的函数式编程,该包下的函数式接口有:
- BiConsumer<T,U>: 表明了一个接受两个输入参数的操做,而且不返回任何结果
- BiFunction<T,U,R>: 表明了一个接受两个输入参数的方法,而且返回一个结果
- BinaryOperator<T>: 表明了一个做用于于两个同类型操做符的操做,而且返回了操做符同类型的结果
- BiPredicate<T,U>: 表明了一个两个参数的boolean值方法
- BooleanSupplier: 表明了boolean值结果的提供方
- Consumer<T>: 表明了接受一个输入参数而且无返回的操做
- DoubleBinaryOperator: 表明了做用于两个double值操做符的操做,而且返回了一个double值的结果。
- DoubleConsumer: 表明一个接受double值参数的操做,而且不返回结果。
- DoubleFunction<R>: 表明接受一个double值参数的方法,而且返回结果
- DoublePredicate: 表明一个拥有double值参数的boolean值方法
- DoubleSupplier: 表明一个double值结构的提供方
- DoubleToIntFunction: 接受一个double类型输入,返回一个int类型结果。
- DoubleToLongFunction: 接受一个double类型输入,返回一个long类型结果
- DoubleUnaryOperator: 接受一个参数同为类型double,返回值类型也为double 。
- Function<T,R>: 接受一个输入参数,返回一个结果。
- IntBinaryOperator: 接受两个参数同为类型int,返回值类型也为int 。
- IntConsumer: 接受一个int类型的输入参数,无返回值 。
- IntFunction<R>: 接受一个int类型输入参数,返回一个结果 。
- IntPredicate: 接受一个int输入参数,返回一个布尔值的结果。
- IntSupplier: 无参数,返回一个int类型结果。
- IntToDoubleFunction: 接受一个int类型输入,返回一个double类型结果 。
- IntToLongFunction: 接受一个int类型输入,返回一个long类型结果。
- IntUnaryOperator: 接受一个参数同为类型int,返回值类型也为int 。
- LongBinaryOperator: 接受两个参数同为类型long,返回值类型也为long。
- LongConsumer: 接受一个long类型的输入参数,无返回值。
- LongFunction<R>: 接受一个long类型输入参数,返回一个结果。
- LongPredicate: R接受一个long输入参数,返回一个布尔值类型结果。
- LongSupplier: 无参数,返回一个结果long类型的值。
- LongToDoubleFunction: 接受一个long类型输入,返回一个double类型结果。
- LongToIntFunction: 接受一个long类型输入,返回一个int类型结果。
- LongUnaryOperator: 接受一个参数同为类型long,返回值类型也为long。
- ObjDoubleConsumer<T>: 接受一个object类型和一个double类型的输入参数,无返回值。
- ObjIntConsumer<T>: 接受一个object类型和一个int类型的输入参数,无返回值。
- ObjLongConsumer<T>: 接受一个object类型和一个long类型的输入参数,无返回值。
- Predicate<T>: 接受一个输入参数,返回一个布尔值结果。
- Supplier<T>: 无参数,返回一个结果。
- ToDoubleBiFunction<T,U>: 接受两个输入参数,返回一个double类型结果
- ToDoubleFunction<T>: 接受一个输入参数,返回一个double类型结果
- ToIntBiFunction<T,U>: 接受两个输入参数,返回一个int类型结果。
- ToIntFunction<T>: 接受一个输入参数,返回一个int类型结果。
- ToLongBiFunction<T,U>: 接受两个输入参数,返回一个long类型结果。
- ToLongFunction<T>: 接受一个输入参数,返回一个long类型结果。
- UnaryOperator<T>: 接受一个参数为类型T,返回值类型也为T。