Java8 Lambda表達式

概述

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

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中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: 代表了一個接受兩個輸入參數的操作,並且不返回任何結果
  2. BiFunction: 代表了一個接受兩個輸入參數的方法,並且返回一個結果
  3. BinaryOperator: 代表了一個作用於於兩個同類型操作符的操作,並且返回了操作符同類型的結果
  4. BiPredicate: 代表了一個兩個參數的boolean值方法
  5. BooleanSupplier: 代表了boolean值結果的提供方
  6. Consumer: 代表了接受一個輸入參數並且無返回的操作
  7. DoubleBinaryOperator: 代表了作用於兩個double值操作符的操作,並且返回了一個double值的結果。
  8. DoubleConsumer: 代表一個接受double值參數的操作,並且不返回結果。
  9. DoubleFunction: 代表接受一個double值參數的方法,並且返回結果
  10. DoublePredicate: 代表一個擁有double值參數的boolean值方法
  11. DoubleSupplier: 代表一個double值結構的提供方
  12. DoubleToIntFunction: 接受一個double類型輸入,返回一個int類型結果。
  13. DoubleToLongFunction: 接受一個double類型輸入,返回一個long類型結果
  14. DoubleUnaryOperator: 接受一個參數同為類型double,返回值類型也為double 。
  15. Function: 接受一個輸入參數,返回一個結果。
  16. IntBinaryOperator: 接受兩個參數同為類型int,返回值類型也為int 。
  17. IntConsumer: 接受一個int類型的輸入參數,無返回值 。
  18. IntFunction: 接受一個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: 接受一個long類型輸入參數,返回一個結果。
  27. LongPredicate: R接受一個long輸入參數,返回一個布爾值類型結果。
  28. LongSupplier: 無參數,返回一個結果long類型的值。
  29. LongToDoubleFunction: 接受一個long類型輸入,返回一個double類型結果。
  30. LongToIntFunction: 接受一個long類型輸入,返回一個int類型結果。
  31. LongUnaryOperator: 接受一個參數同為類型long,返回值類型也為long。
  32. ObjDoubleConsumer: 接受一個object類型和一個double類型的輸入參數,無返回值。
  33. ObjIntConsumer: 接受一個object類型和一個int類型的輸入參數,無返回值。
  34. ObjLongConsumer: 接受一個object類型和一個long類型的輸入參數,無返回值。
  35. Predicate: 接受一個輸入參數,返回一個布爾值結果。
  36. Supplier: 無參數,返回一個結果。
  37. ToDoubleBiFunction: 接受兩個輸入參數,返回一個double類型結果
  38. ToDoubleFunction: 接受一個輸入參數,返回一個double類型結果
  39. ToIntBiFunction: 接受兩個輸入參數,返回一個int類型結果。
  40. ToIntFunction: 接受一個輸入參數,返回一個int類型結果。
  41. ToLongBiFunction:
    接受兩個輸入參數,返回一個long類型結果。
  42. ToLongFunction: 接受一個輸入參數,返回一個long類型結果。
  43. UnaryOperator: 接受一個參數為類型T,返回值類型也為T。


分享到:


相關文章: