lambda VS 匿名類 節選1
阿新 • • 發佈:2020-08-01
- lambda是函數語言程式設計.很多語言中,函式(方法)是一等公民,無需依附於任何其它元素即可存在,並可以作為引數和返回值.而Java中只有類是一等公民,方法必須依附於某個類.
Java現在也支援lambda了 - 看例程: 兩種方式遍歷List,遍歷Map
- 看例程: lambda相當於是Java通過一頓後臺操作幫我們生成了一個類來實現介面,並呼叫我們提供的方法
- 看例程: 使用stream和collector,理解lambda的美
- 看例程: lambda可以有返回值和異常
兩個靜態方法
public static List<String> addElementsToList(List<String> list) { for (int i = 0; i < 22; i++) { list.add("str" + i); } return list; }
private static void processString(String str) {
System.out.println(str);
}
普通輸出集合方式
List<String> myList = addElementsToList(new ArrayList<>()); String outside = "outside string"; for (String s : myList) { processString(outside + s); }
匿名內部類版本
// TODO 匿名內部類版
myList.forEach(
new Consumer<String>() {
@Override
public void accept(String s) {
processString(outside + s);
}
}
);
lambda完整版
// TODO lambda的表示式必須能夠符合介面中定義的抽象方法,從引數,到返回值,到異常,都必須匹配 // TODO lambda 完整版 (引數) -> {程式碼塊} // TODO lambda可以有返回值,使用return語句就可以,當然我們這個介面沒有,我們的lambda表示式也不能有 // TODO lambda可以使用外部資料,怎麼看都和匿名內部類是一樣的 myList.forEach( (s) -> { processString(outside + s); } );
lambda簡化版,去除了引數後大括號
// TODO lambda 單引數,程式碼單行 簡化版,
myList.forEach(s -> processString(outside + s));
lambda終極版,如果不使用外部變數
// TODO lambda 如果不使用外部變數,還有方法引用終極簡化版
myList.forEach(IterateListLambdaAppMain::processString);
lambda終極版,不是靜態方法的話
// TODO lambda 方法引用終極簡化版:不是靜態方法,用引用也可以
IterateListLambdaAppMain inst = new IterateListLambdaAppMain();
myList.forEach(inst::processStringInst);
private void processStringInst(String str) {
System.out.println(str);
}
// TODO lambda也允許指定一個引數型別裡的一個方法作為方法的引用
myList.forEach(String::toUpperCase);