概述
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。