前言:本人在看《Java核心技術I》的時候對lamdba表達式還不是太上心,只是當做一個Java 8的特性了解一下而已,可是在《Java核心技術II》里面多次用到,所以重新入門來學。
看教程說()->3就是直接輸出3這個數字,所以我這么寫:
System.out.println(()->3);
果不其然,報錯了,錯誤的提示是:The target type of this expression must be a functional interface.(該表達式的目標類型必須是功能性接口)。也就是時候再怎么不濟,最起碼接收這個表達式的變量類型也是一個功能性接口吧。本人是Java小白一個,不知道functional interface是什么,索性就直接拿個interface來寫了。
public class LambdaTest{ interface Test{ void sayMessage(String message); } public static void main(String[] args) { Test t = message->System.out.println(message); t.sayMessage("3"); //為什么不能是int類型的3呢?因為在接口里面就已經聲明了sayMessage方法的參數是一個String類型的變量。 } }
以上一個很簡單的輸出語句。但是也要經過:創建接口->定義方法->實現方法這幾個步驟才能實現System.out.println()語句。
那假設我想要用lambda表達式進行加法運算呢?可以直接用()->1+2得到嗎?答案是肯定不行啊!那可以直接用上面的代碼修改成message->1+2嗎?答案也是不行滴。為什么呢?請看報錯的信息先:Void methods cannot return a value。當初是你要void,void就void,現在又要用int,把value return回來 。
那么重新改下代碼,改成這樣子:
interface Test{ int sayMessage(String message); } public static void main(String[] args) { Test t = message->1+2; System.out.println(t.sayMessage("1")); }
會發現,打印出來的值是3,傳入的參數"1"沒有任何作用,那留着"String message"這個參數做什么呢?過年加菜嗎?所以可以改成:
interface Test{ int sayMessage(); } public static void main(String[] args) { Test t = ()->1+2; //此處不需要參數,因為lambda表達式中沒有參數。 System.out.println(t.sayMessage()); }
結果依然是打印出3。