3 回答
TA贡献1854条经验 获得超8个赞
你的问题真的没有意义。如果您将建议的BinaryOperator.identity
方法粘贴到 IDE 中,您会立即看到它会抱怨标识符t
被声明了两次。
为了解决这个问题,我们需要为每个参数使用不同的标识符:
return (t, u) -> t;
现在我们可以清楚地看到这不是一个恒等函数。这是一个接受两个参数并返回第一个参数的方法。因此,最好的名字应该是这样的getFirst
。
回答您关于 JDK 中是否有类似内容的问题:no。使用标识函数是一个常见的用例,因此为此定义一个方法很有用。任意返回两个的第一个参数不是一个常见的用例,并且有一个方法来做到这一点是没有用的。
TA贡献1793条经验 获得超6个赞
T
意味着它们具有相同的类型,而不是相同的值,这本身就不是一个身份。
,它只是手段BinaryOperator
将被用于相同类型,但是提供identity
了不同的值......这在某种程度上听起来像foldLeft
或foldRight
或者foldLeftIdentity/foldRightIdentity
,没有哪个Java。
TA贡献1804条经验 获得超7个赞
您的代码似乎可以改进为
List<String> list = Arrays.asList("Abcd", "Abcd");
Map<String, Integer> map = list.stream()
.collect(Collectors.toMap(Function.identity(), String::length, (a, b) -> a));
System.out.println(map.size());
或者可能对于您的用例,我不想对相同键的两个值做任何事情,我只想返回一个值,您可以选择在使用实现时随机返回任何值,如下所示:
private static <T> BinaryOperator<T> any() {
return Math.random() < 0.5 ? ((x, y) -> x) : ((x, y) -> y);
}
然后在您的代码中将其用作
Map<String, Integer> map = list.stream()
.collect(Collectors.toMap(Function.identity(), String::length, any()));
多亏了 Holger、Eugene 和 Federico 的建议,该any方法还有其他有效的实现可以实际涉及使用:
private static <T> BinaryOperator<T> any() {
// suggested by Holger
return ThreadLocalRandom.current().nextBoolean() ? ((x, y) -> x) : ((x, y) -> y);
// suggested by Eugene
long nt = System.nanoTime();
((nt >>> 32) ^ nt) > 0 ? ((x, y) -> x) : ((x, y) -> y);
}
添加回答
举报