Java8 Lambda表達式

概述

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表達式呢?接口

Java8 Lambda表達式

 

Java8 Lambda表達式

運行結果字符串

能夠看出lambda表達式實質是實現了接口中的方法,怎麼感受向匿名內部類呢?

lambda表達式與匿名內部類的區別:

  1. this關鍵字。匿名內部類中的this指當前匿名類,lambda表達式中的this指lambda的外部類。

FunctionInterface註解:

@ FunctionInterface 是Java8中新加入的接口, 用於指明該接口是根據Java語言規範定義的函數式接口。例如以下代碼:

@FunctionInterface
public interface MathOperation{
public int operation(int a, int b);
}

若在接口中加入更多的抽象方法, 將拋出編譯錯誤。

lambda表達式中的變量

Java8 Lambda表達式

 

這樣看沒什麼毛病,可是要想在後面修改該字符串,問題就來了

Java8 Lambda表達式

 

能夠看到,lambda表達式使用的外部的局部變量必須是final的,那麼成員變量呢?

Java8 Lambda表達式

 

成員變量以及靜態變量可使用,並在以後進行修改,至於緣由能夠看個人這篇文章

Java 內部類

Java中lambda表達式舉例

那麼Java中引入lambda表達式能夠帶來怎樣的便利呢?經過下面幾個例子能夠看一看:

1.建立線程

Java8 Lambda表達式

 

2.遍歷list

Java8 Lambda表達式

 

固然還有不少,能夠本身嘗試

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的函數式編程,該包下的函數式接口有:

  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。
相關文章
相關標籤/搜索