1. 程式人生 > >Java8的Lambda表示式簡介

Java8的Lambda表示式簡介

  先闡述一下JSR(Java Specification Requests)規範,即Java語言的規範提案。是向JCP(Java Community Process)提出新增一個標準化技術規範的正式請求。任何人都可以提交JSR,可以向Java平臺增添新的API和服務。JSR已成為Java界的一個重要標準。可以理解為JSR是Java開發者以及授權者指定的標準,而Java開發者以及授權者形成一個JCP國際組織。職能是制定Java標準,即所有的規範都是有跡可循的。

  在Java8中推出的lambda表示式(參考JSR-335,地址為https://jcp.org/en/jsr/detail?id=335),官方的描述是:擴充套件Java語言以支援緊湊的lambda表示式(閉包),以及相關的語言和庫功能,以使JavaSE的API能夠使用lambda有效表達。通俗的理解為通過lambda表示式的本質是語法糖(Syntactic sugar,在計算機語言中新增的某種語法,這種語法對語言的功能沒有影響,但是更方便程式設計師使用。語法糖讓程式更加簡潔,有更高的可讀性),其底層還是通過編譯器自動推斷並生成匿名類來實現。可以使用更少的程式碼來實現同樣的功能,使程式碼簡潔的同時也使得Java支援閉包的功能。詳見list.stream()和java.util.function包下提供了諸多的function介面。

  lambda表示式的語法:

     (parameters) -> expression 或

     (parameters) -> { statements; },

    即() -> {},等同於 new Interface(){}

  講了一堆廢話,貼程式碼吧:

package com.mengyao.bigdata.lambda;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Map、List和class的lambda使用
 * lambda本質是 (parameters) -> expression; 或者 (parameters) -> { statements; }。即() -> {},等同於 new Interface(){}
 * 
@author mengyao * */ public class Test1 { public static void main(String[] args) { // ==== 1 ==== Map的lambda示例,jdk8之前的寫法就不貼出來了 Map<String, Integer> map = new HashMap<String, Integer>() {{ put("spark", 1); put("storm", 1); put("hadoop", 1); put(
"flink", 1); }}; /** * parameters確定 * map.forEach引數為java.util.function.BiConsumer<? super String, ? super Integer> action,是一個介面的宣告, * 實現採用的是for(Map.Entry<K, V> entry : entrySet())將entry的k和v作為引數傳遞到action.accept(k,v)中 驗證,到此k,v引數已確定。 * expression使用 * 接下來是給到lambda的expression來使用 * 所以如下3個map.forEach同理 */ map.forEach((k,v) -> System.out.println(k+":"+v)); map.forEach((k,v) -> {System.out.println(k+":"+v);}); map.forEach((k,v) -> { if (k.equals("spark")) { System.out.println(k+":"+v); } }); System.out.println("===="); // ==== 2 ==== List的lambda示例 List<String> list = new ArrayList<String>(10) {{ add("spark"); add("storm"); add("hadoop"); add("flink"); }}; // 與map.forEach同理 list.forEach(System.out::println);//System.out是PrintStream的例項,::println即為呼叫System.out物件的println方法 list.forEach(item -> System.out.println(item)); list.forEach(item -> {System.out.println(item);}); list.forEach(item -> { if (item.equals("spark")) { System.out.println(item); } }); //==== 3 ==== 自定義類的lambda使用 // 介面類非lambda方式使用 System.out.println("==== "+new MathService() { @Override public int plus(int a, int b) { return a+b; } }.plus(1, 2)); // 介面類lambda方式使用1(實現plus方法) MathService service = (a,b) -> a+b; System.out.println("==== "+service.plus(1, 2)); // 介面類lambda方式使用2,將介面的實現作為引數 print((a,b)->a+b); } /** * 使用介面作為引數,通常方法內部會呼叫介面的方法 * @param service */ static void print(MathService service) { int a =1,b=2; System.out.println(service.plus(a, b)); } }
interface MathService { //return a+b int plus(int a, int b); }

  補充一下,稍後會上傳一些複雜用例。