一塊兒來學Java8(二)——Lambda表達式

Lambda簡介

什麼是Lambda表達式,簡單的說是一種匿名函數表達方式。所以Lambda表達式本質是個函數,只不過沒有函數名稱。java

Lambda表達式具備如下特色:ide

  • 匿名,它沒有函數名稱
  • 本質是個函數,除了函數名,它有參數列表、函數內容(方法體)、返回類型
  • 簡潔,有時候能夠省略參數的類型
  • 可傳遞,Lambda表達式能夠當作一個變量進行存儲

Lambda的基本語法是:函數

(參數列表) -> 表達式學習

this

(參數列表) -> { 表達式; }code

哪裏可使用Lambda

有函數式接口的地方就可使用Lambda表達式。接口

函數式接口的定義:一個接口裏面只有一個抽象方法。字符串

拿Runnable接口來講,它是一個函數式接口,Runnable用法以下代碼所示:get

Thread thread = new Thread(new Runnable() {
	@Override
	public void run() {
		System.out.println("run...");
	}
});
thread.start();
Thread.sleep(100);

因爲Runnable是個函數式接口,所以可使用Lambda表示替換,替換後以下:it

// 方式2
Thread thread2 = new Thread(() -> System.out.println("run2..."));
thread2.start();
Thread.sleep(100);

這裏的Lambda表達式內容即爲:() -> System.out.println("run2..."),其中沒有參數,沒有返回值,只有一個方法體。這個表達式一樣能夠寫成:

Thread thread2 = new Thread(() -> { 
    System.out.println("run2..."); // 注意這裏;結尾
});

注意:加了花括號,方法體內部語句必需要有;結尾

還有一個函數式接口Callable,其內部的call方法須要返回一個值,Callable的使用方式以下代碼所示:

ExecutorService excutorService = Executors.newSingleThreadExecutor();
Future<String> future = excutorService.submit(new Callable<String>() {
	@Override
	public String call() throws Exception {
		return "Jim";
	}
});
String name = future.get();	
System.out.println(name);

使用Lambda表達式:

ExecutorService excutorService = Executors.newSingleThreadExecutor();
Future<String> future = excutorService.submit(() -> "Jim2");
String name = future.get();	
System.out.println(name);

這裏() -> "Jim2"表示直接返回一個Jim2字符串,能夠省略return關鍵字。固然也能夠寫成:

excutorService.submit(() -> {
	return "Jim2";
});

下面咱們自定義一個函數式接口,而後使用Lambda表達式來書寫。

package learn.java8.ch2;

// 函數式接口
@FunctionalInterface
interface Caller {
	String call(String name);
}

class Serivce {
	private String name;
	
	public Serivce(String name) {
		this.name = name;
	}
	
	public String run(Caller caller) {
		return caller.call(name);
	}
}

public class LambdaTest2 {

	public static void main(String[] args) {
		Serivce service = new Serivce("Jim");
		String result = service.run((name) -> {
			return "My name is " + name;
		});
		System.out.println(result);
	}

}

此時Lambda表達式爲:

(name) -> {
	return "My name is " + name;
}

它具備參數列表、方法體、返回結果組成

注意:name實際類型被省略了,能夠加上:

String result = service.run((String name) -> {
	return "My name is " + name;
});

若是有多個參數,則寫成:

(String a, String b) -> {}(a, b) -> {}

Lambda表達式還能夠當作變量進行存儲,以下代碼所示:

package learn.java8.ch2;

import java.util.function.Consumer;

public class LambdaTest3 {

	static Consumer<String> consumer = (name) -> {
		System.out.println("My name is " + name);
	};

	static class Service {
		private String name;

		public Service(String name) {
			super();
			this.name = name;
		}

		public void run(Consumer<String> consumer) {
			consumer.accept(name);
		}
	}

	public static void main(String[] args) {
		// 能夠直接調用
		consumer.accept("Jim");
		
		new Service("Tom").run(consumer);
	}

}

在這個例子中直接使用Lambda表達式定義了一個接口實現:

static Consumer<String> consumer = (name) -> {
	System.out.println("My name is " + name);
};

能夠理解爲將Lambda表達式賦給了consumer變量當中,也能夠理解爲直接實現了Consumer接口中的方法。

總之,只要有函數式接口的地方均可以使用Lambda表達式。

小結

本篇主要介紹了Lambda表達式的基本用法,以及在函數式接口中的使用方式。

按期分享技術乾貨,一塊兒學習,一塊兒進步!

相關文章
相關標籤/搜索