java.util.function.Function.identity 方法的实际用途是什么?

为什么我应该使用 Function.identity() 当它返回与它接收到的相同的东西而不使用输入或以某种方式修改输入的情况下?


Apple apple = new Apple(10, "green");

Function<Apple, Apple> identity = Function.identity();

identity.apply(apple);

必须有一些我无法弄清楚的实际用法。


梦里花落0921
浏览 839回答 3
3回答

catspeake

预期用途是当您使用接受 aFunction来映射某些内容的方法时,您需要将输入直接映射到函数的输出(“身份”函数)。作为一个非常简单的示例,将人员列表映射到从名称到人员的映射:import static java.util.function.Function.identity// [...]List<Person> persons = ...Map<String, Person> = persons.stream()&nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toMap(Person::name, identity()))该identity()功能只是为了方便和可读性。正如彼得在他的回答中指出的那样,您可以只使用t -> t,但我个人认为使用identity()可以更好地传达意图,因为它没有留下解释的余地,例如怀疑原作者是否忘记在该 lambda 中进行转换。我承认这是非常主观的,并假设读者知道是什么identity()。可能它在内存方面可能有一些额外的优势,因为它重用单个 lambda 定义,而不是为此调用具有特定的 lambda 定义。我认为在大多数情况下,这种影响可能可以忽略不计。

慕尼黑8549860

例如,您可以将其用于频率计数。public static <T> Map<T, Long> frequencyCount(Collection<T> words) {&nbsp; &nbsp; return words.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.groupingBy(Function.identity(),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Collectors.counting());}在这种情况下,您是说分组依据的关键是集合中的元素(不对其进行转换)。就个人而言,我觉得这个更简短import static java.util.stream.Collectors.*;public static Map<String, Long> frequencyCount(Collection<String> words) {&nbsp; &nbsp; return words.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(groupingBy(t -> t,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; counting());}

阿晨1998

假设你有一个List<String> strings = List.of("abc", "de")和你想生成一个Map地方Key是价值形式的列表和价值是它的长度:&nbsp;Map<String, Integer> map = strings.stream()&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toMap(Function.identity(), String::length))&nbsp;一般来说,有些人认为Function.identity()可读性比例t -> t如低一点,但正如这里所解释的,这有点不同。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java