歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java 8函數編程輕松入門

Java 8函數編程輕松入門

日期:2017/3/1 9:09:53   编辑:Linux編程

Java 8函數編程輕松入門

  • 函數接口介紹

  • 在Java1.8中,新增了Lambda表達式。在.net3.5(C# 3.0)在原先的匿名方法基礎上演變出了Lambda表達式。學過C# Lambda表達式的同學,對於Java的Lambda表達式就不會太陌生。
  • 在Java中,沒有委托的概念,為了配合Lambda表達式,Java推出了函數接口這個概念,來作為Java Lambda表達式的類型。
  • 1. 函數接口定義:

  • 函數接口是只有一個抽象方法的接口,用作於Lambda表達式的類型
  • 注解:
  • 1.在所定義的接口類上加上@FunctionalInterface注解,主要用於編譯錯誤檢查
  • 2.我們所定義的接口,有且只有一種抽象方法(沒有方法體的方法)
  • 3.允許定義默認方法(使用default修飾的方法)
  • 4.允許定義靜態方法
//定義一個函數接口
@FunctionalInterface
public interface Speak {
    void say(String msg);
}

//未新增Lambda表達式的時候,實現Speak接口如下
Speak hello = new Speak() {
    @Override
    public void say(String msg) {
        System.out.println(msg);
    }
};

hello.say("hello world.");//輸出hello world.

//新增Lambda表達式之後,實現Speak接口如下,有沒有覺得代碼精簡許多
Speak hello = msg -> System.out.println(msg);

hello.say("hello world.");//輸出hello world.
  • 2. Lambda表達式的簡化過程

  • lambda表達式有類型推斷的功能(Java1.7引入的),可以在javac推斷出泛型參數的類型。
//lambda表達式版本1
BinaryOperator<Integer> addComplex = (Integer x, Integer y) -> {
            return x - y;
        };
        
//利用類型推斷之後的產生版本2,這時候可以省略參數的類型
BinaryOperator<Integer> addComplex = (x, y) -> {
            return x - y;
};


//如果Lambda表達式Body只有一行代碼,可以省略掉大括號({})
BinaryOperator<Integer> addComplex = (x, y) -> x - y;
  • 3. 系統提供的函數接口

  • 在C# 3.0中,有默認提供的Func<...>泛型委托及Action<...>泛型委托。在Java1.8中,同樣有類似默認提供的函數接口。其中重要的函數接口如下:
  • 3.1 BinaryOperator
  • 參數: (T,T)
  • 返回類型: T
  • 說明: 二元操作符函數接口
  • 示例:
BinaryOperator<Integer> add = (x, y) -> x + y ;
System.out.println(add.apply(1, 2));//3
  • 3.2 UnaryOperator
  • 參數: T
  • 返回類型: T
  • 說明: 一元操作符函數接口
  • 示例:
UnaryOperator<Boolean> result = x -> !x;
System.out.println(result.apply(1 > 0));//false
  • 3.3 Predicate
  • 參數: T
  • 返回類型: boolean
  • 說明: 條件判斷函數接口
  • 示例:
Predicate<Integer> predicate = x -> x > 0;
System.out.println(predicate.test(1));//true
  • 3.4 Consumer
  • 參數: T
  • 返回類型: void
  • 說明: T作為輸入,執行某種動作但沒有返回值(類似我們上面Speak接口定義的)
  • 示例:
Consumer<String> say = msg -> System.out.println(msg);
say.accept("Hello World Java 1.8");//Hello World Java 1.8
  • 3.5 Function<T,R>
  • 參數: T
  • 返回類型: R
  • 說明: 接受一個T參數,並返回R類型的函數接口
  • 示例:
Function<String, Integer> strLen = m -> m.length();//計算輸入的字符串的長度
System.out.println(strLen.apply("HelloWorld"));//10
  • 3.6 Supplier
  • 參數: None
  • 返回類型: T
  • 說明: 沒有任何輸入,返回T
  • 示例:
Supplier<String> he=()->"HelloWorld.";
System.out.print(he.get());
  • 4. 總結

  • 1.Lambda表達式是一個匿名方法,將行為像數據一樣進行傳遞
  • 2.函數接口指僅具有單個抽象方法的接口,用來表示Lambda表達式的類型

  • 5. 習題

  • 1.哪些是Lambda表達式Function<LONG,LONG>的有效實現,並說明不對的理由。

x -> x + 1;
(x, y) -> x + 1;
x -> x ==1;
  • 2.FirstLambda的兩個check是能夠正確重載,其中firstLambda.check又是調用的哪個check方法
@FunctionalInterface
public interface Check {
    boolean IntPred(Integer n);
}

public class FirstLambda {
    public static void main(String[] args) {
        Predicate<Integer> predicate = x -> x > 0;
        FirstLambda firstLambda = new FirstLambda();
        boolean result=firstLambda.check(predicate, 2);
        System.out.println(result);
    }


    public boolean check(Predicate<Integer> predicate, int n) {
        return predicate.test(n);
    }

    public boolean check(Check check, int n) {
        return check.IntPred(n);
    }
}

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2016-11/136940p2.htm

Copyright © Linux教程網 All Rights Reserved