3 回答

TA貢獻1111條經驗 獲得超0個贊
預期用途是當您使用接受 aFunction來映射某些內容的方法時,您需要將輸入直接映射到函數的輸出(“身份”函數)。
作為一個非常簡單的示例,將人員列表映射到從名稱到人員的映射:
import static java.util.function.Function.identity
// [...]
List<Person> persons = ...
Map<String, Person> = persons.stream()
.collect(Collectors.toMap(Person::name, identity()))
該identity()功能只是為了方便和可讀性。正如彼得在他的回答中指出的那樣,您可以只使用t -> t,但我個人認為使用identity()可以更好地傳達意圖,因為它沒有留下解釋的余地,例如懷疑原作者是否忘記在該 lambda 中進行轉換。我承認這是非常主觀的,并假設讀者知道是什么identity()。
可能它在內存方面可能有一些額外的優勢,因為它重用單個 lambda 定義,而不是為此調用具有特定的 lambda 定義。我認為在大多數情況下,這種影響可能可以忽略不計。

TA貢獻1818條經驗 獲得超11個贊
例如,您可以將其用于頻率計數。
public static <T> Map<T, Long> frequencyCount(Collection<T> words) {
return words.stream()
.collect(Collectors.groupingBy(Function.identity(),
Collectors.counting());
}
在這種情況下,您是說分組依據的關鍵是集合中的元素(不對其進行轉換)。
就個人而言,我覺得這個更簡短
import static java.util.stream.Collectors.*;
public static Map<String, Long> frequencyCount(Collection<String> words) {
return words.stream()
.collect(groupingBy(t -> t,
counting());
}

TA貢獻2037條經驗 獲得超6個贊
假設你有一個List<String> strings = List.of("abc", "de")和你想生成一個Map地方Key是價值形式的列表和價值是它的長度:
Map<String, Integer> map = strings.stream()
.collect(Collectors.toMap(Function.identity(), String::length))
一般來說,有些人認為Function.identity()可讀性比例t -> t如低一點,但正如這里所解釋的,這有點不同。
添加回答
舉報