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如低一点,但正如这里所解释的,这有点不同。
添加回答
举报