关于使用Function.identity()方法的问题。
假设我们有以下代码:
Arrays.asList("a", "b", "c")
.stream()
.map(Function.identity()) // <- Этот кусок
.map(str -> str) // <- равен этому.
.collect(Collectors.toMap(
Function.identity(), // <-- А этот
str -> str)); // <-- равен этому.
我应该Function.identity()改用str->str(反之亦然)吗?我认为第二个选项更具可读性和可理解性(例如,如果一个新人不知道他在做什么identity)。但是,为什么应该首选其中一种方法是否有“真正的”原因?
最初,这两种方法似乎没有区别,因为实现
identity()如下:但是,
Function.identity()它将始终返回相同的实例(此决定的基本原理),而t -> t它不仅会创建一个新实例,它甚至还会有一个单独的实现类。有关详细信息,请参见此处。原因是编译器生成了一个合成方法,其中包含 lambda 表达式的主体(在这种情况下
t -> t它将是return t;),并告诉运行时创建调用该方法的功能接口的实现。所以使用
Function.identity()insteadt -> t可能会节省一些内存,但不会太多,所以如果你认为它t -> t比Function.identity().此外,在某些方法中,您不能调用
Function.identity(). 假设我们有一个这样的列表:下面的代码编译得很好:
但是如果你尝试编译下面的代码,你会得到一个编译错误:
它会因
mapToInt预期而发生,与预期ToIntFunction无关Function。它也没有ToIntFunction方法identity()。