• <nav id="wkkge"><strong id="wkkge"></strong></nav>
  • <menu id="wkkge"></menu>
  • Java8新特性
    Java9新特性

    Java8函數式接口

     

     

    函數式接口(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的接口。

     

    函數式接口可以被隱式轉換為 lambda 表達式。

     

    Lambda 表達式和方法引用(實際上也可認為是Lambda表達式)上。

     

    如定義了一個函數式接口如下:

     

    @FunctionalInterface
    interface GreetingService 
    {
        void sayMessage(String message);
    }

     

    那么就可以使用Lambda表達式來表示該接口的一個實現(注:JAVA 8 之前一般是用匿名類實現的):

     

    GreetingService greetService1 = message -> System.out.println("Hello " + message);

     

    函數式接口可以對現有的函數友好地支持 lambda。

     

    JDK 1.8 之前已有的函數式接口:

     

    • java.lang.Runnable

     

    • 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

     

    JDK 1.8 新增加的函數接口:

     

    • java.util.function

     

    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。

     

     

    函數式接口實例

     

    Predicate <T>接口是一個函數式接口,它接受一個輸入參數 T,返回一個布爾值結果。

     

    該接口包含多種默認方法來將Predicate組合成其他復雜的邏輯(比如:與,或,非)。

     

    該接口用于測試對象是 true 或 false。

     

    我們可以通過以下實例(Java8Tester.java)來了解函數式接口 Predicate <T>的使用:

     

    import java.util.Arrays;
    import java.util.List;
    import java.util.function.Predicate;
     
    public class Java8Tester {
       public static void main(String args[]){
          List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
            
          // Predicate<Integer> predicate = n -> true
          // n 是一個參數傳遞到 Predicate 接口的 test 方法
          // n 如果存在則 test 方法返回 true
            
          System.out.println("輸出所有數據:");
            
          // 傳遞參數 n
          eval(list, n->true);
            
          // Predicate<Integer> predicate1 = n -> n%2 == 0
          // n 是一個參數傳遞到 Predicate 接口的 test 方法
          // 如果 n%2 為 0 test 方法返回 true
            
          System.out.println("輸出所有偶數:");
          eval(list, n-> n%2 == 0 );
            
          // Predicate<Integer> predicate2 = n -> n > 3
          // n 是一個參數傳遞到 Predicate 接口的 test 方法
          // 如果 n 大于 3 test 方法返回 true
            
          System.out.println("輸出大于 3 的所有數字:");
          eval(list, n-> n > 3 );
       }
        
       public static void eval(List<Integer> list, Predicate<Integer> predicate) {
          for(Integer n: list) {
            
             if(predicate.test(n)) {
                System.out.println(n + " ");
             }
          }
       }
    }

     

    執行以上腳本,輸出結果為:

     

    $ javac Java8Tester.java 
    $ java Java8Tester
    輸出所有數據:
    1 
    2 
    3 
    4 
    5 
    6 
    7 
    8 
    9 
    輸出所有偶數:
    2 
    4 
    6 
    8 
    輸出大于 3 的所有數字:
    4 
    5 
    6 
    7 
    8 
    9 

     

    全部教程
  • <nav id="wkkge"><strong id="wkkge"></strong></nav>
  • <menu id="wkkge"></menu>
  • 面对面棋牌游戏