为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

梦里花落0921 2021-10-13 16:45:41
为什么我应该使用 Function.identity() 当它返回与它接收到的相同的东西而不使用输入或以某种方式修改输入的情况下?Apple apple = new Apple(10, "green");Function<Apple, Apple> identity = Function.identity();identity.apply(apple);必须有一些我无法弄清楚的实际用法。
查看完整描述

3 回答

?
catspeake

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 定义。我认为在大多数情况下,这种影响可能可以忽略不计。


查看完整回答
反对 回复 2021-10-13
?
慕尼黑8549860

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());

}


查看完整回答
反对 回复 2021-10-13
?
阿晨1998

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


查看完整回答
反对 回复 2021-10-13
  • 3 回答
  • 0 关注
  • 838 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信