這兩天開始看jdk8的新特性,先看了lembda表示式和stream,就乙個感覺,優雅。
趕緊將這兩天的成果總結一下
lembda表示式是乙個簡潔、可傳遞的匿名函式,實現了把**塊賦值給乙個變數的功能
格式就是(parameters) -> expression
,需要注意的是:
引數可以為空 ()->***
引數為乙個值得時候,可以省略引數的括號 x->***
表示式只有一行的時候不需要;
,有多行的時候需要加上;
表示式可以是乙個數字(直接返回這個數字),乙個算式;可以是普通的乙個語句(無返回,相當於void)
引數的名不能和區域性變數相同
表示式中直接呼叫的變數(不是傳入的),必須是顯示宣告為final或事實上的final型別
lambda表示式的使用需要借助於函式式介面
含有且僅含有乙個抽象方法的介面被稱為函式式介面
需要注意的是,default
關鍵字可以在介面中定義實現,如果乙個介面含有多個實現但是只有乙個抽象方法,那麼它也屬於函式式介面
自定義函式式介面
一般用@functioninte***ce
對函式式介面來進行語義化標註
步驟:定義乙個函式式介面
@functionalinte***ce
}
public static void main(string args)
對這個介面的抽象方法進行實現,並用該介面進行接收,
呼叫這個方法
結果:result = 3
jdk自帶的函式式介面
predicate
進行判斷
boolean test(t t);
利用我們在外部設定的條件對於傳入的引數進行校驗並返回驗證通過與否
consumer
消費者 void accept(t t);
接收引數並依據傳遞的行為應用傳遞的引數值
function
r apoly(t t);
執行轉換操作,輸入型別 t 的資料,返回 r 型別的結果
這三個是最重要的介面,其他的介面都是從這三個介面演化而來,下面我強行使用這三個介面
/*predicate判斷*/
predicatestringpredicate = str -> stringutils.isblank(str) || "error".equalsignorecase(str);
/*consumer*/
consumerstringconsumer = str ->
};/*function*/
functionstringstringfunction = str -> else
};string in = "error";
if (stringpredicate.test(in))
stringconsumer.accept(in);
在表示式中,可以使用::更方便的呼叫方法,它會自動將引數傳入,並且將返回值返回
比如system.out.println(傳入引數)
可以轉換為system.out::println
表示式只需要呼叫乙個方法就可以完成功能的時候,可以用這種方法來進一步簡化**;
jdk8的新特性
lambda表示式 格式為 符號左邊為表示式需要的所有引數 符號右邊為表示式要執行的功能 將之前的匿名內部內作為引數傳遞直接可以使用lambda表示式完成 比如lists new arraylist new arraylist stirng public int compare string a,s...
JDK 8 新特性 Stream map 相關
和 clojure 裡面的 map 理解 是一樣的,可以分別獲取流中的每乙個元素,然後在對其做一些操作 1.遍歷字串集合然後轉換成大寫字母 public static void main string args system.out.println newnames stream map 方式 ne...
Jdk8新特性之排序
comparator提供的方法 author wgr create 2020 4 13 16 12 public class person public string getname public void setname string name public integer getage publ...