Function.identity()

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 -> strFunction.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)系

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容