概述
lambda表達式, 是Java8中的一個新特性。可以理解為一個匿名函數。
lambda表達式可以理解為將一個函數濃縮為一行代碼,使代碼更加簡潔緊湊。
lambda表達式語法:
(parameters) -> statement;
或
(parameters) -> {statements;}
參數如下:
- parameters:參數, 可以指定或不指定參數類型, 當只有一個參數時可以不要圓括號
- statement:函數返回值,直接返回該值,無需大括號
- statements:函數體,當使用大括號時需要指明表達式返回的值
lambda表達式實例:
// 無參,返回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中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。