Function.identity()是什么?
// 將Stream轉(zhuǎn)換成容器或Map
Stream<String> stream = Stream.of("I", "love", "you", "too");
Map<String, Integer> map = stream.collect(Collectors.toMap(Function.identity(), String::length));
Function是一個接口,那么Function.identity()是什么意思呢?解釋如下:
Java 8允許在接口中加入具體方法。接口中的具體方法有兩種,default方法和static方法,identity()就是Function接口的一個靜態(tài)方法。
Function.identity()返回一個輸出跟輸入一樣的Lambda表達式對象,等價于形如t -> t形式的Lambda表達式。
identity() 方法JDK源碼如下:
static Function identity() {
return t -> t;
}
Function.identity()的應用
下面的代碼中,Task::getTitle需要一個task并產(chǎn)生一個僅有一個標題的key。task -> task是一個用來返回自己的lambda表達式,上例中返回一個task。
private static Map<String, Task> taskMap(List<Task> tasks) {
return tasks.stream().collect(toMap(Task::getTitle, task -> task));
}
可以使用Function接口中的默認方法identity來讓上面的代碼代碼變得更簡潔明了、傳遞開發(fā)者意圖時更加直接,下面是采用identity函數(shù)的代碼。
import static java.util.function.Function.identity;
private static Map<String, Task> taskMap(List<Task> tasks) {
return tasks.stream().collect(toMap(Task::getTitle, identity()));
}
Function.identity() or t->t?
Arrays.asList("a", "b", "c")
.stream()
.map(Function.identity()) // <- This,
.map(str -> str) // <- is the same as this.
.collect(Collectors.toMap(
Function.identity(), // <-- And this,
str -> str)); // <-- is the same as this.
上面的代碼中,為什么要使用Function.identity()代替str->str呢?它們有什么區(qū)別呢?
在上面的代碼中str -> str和Function.identity()是沒什么區(qū)別的因為它們都是t->t。但是我們有時候不能使用Function.identity,看下面的例子:
List list = new ArrayList<>();
list.add(1);
list.add(2);
下面這段代碼可以運行成功:
int[] arrayOK = list.stream().mapToInt(i -> i).toArray();
但是如果你像下面這樣寫:
int[] arrayProblem = list.stream().mapToInt(Function.identity()).toArray();
運行的時候就會錯誤,因為mapToInt要求的參數(shù)是ToIntFunction類型,但是ToIntFunction類型和Function沒有關(guān)系