【发布时间】:2018-09-12 13:12:10
【问题描述】:
我在 Java8 中的 UnaryOperator 接口中看到了一段代码,它对参数不执行任何操作并返回相同的值。
static <T> UnaryOperator<T> identity() {
return t -> t;
}
BinaryOperator 有什么东西可以接受两个相同类型的参数并返回一个值
static <T> BinaryOperator<T> identity() {
return (t,t) -> t;
}
为什么我问这个问题是为了满足以下要求,
List<String> list = Arrays.asList("Abcd","Abcd");
Map<String,Integer> map = list.stream().collect(Collectors.toMap(str->str,
str->(Integer)str.length(),(t1,t2)->t1));
System.out.println(map.size());
在上面的代码中,我不想为同一个键的两个值做任何事情,我只想返回一个值,因为在我的情况下,值肯定是相同的。 由于我没有使用 t2 值声纳抛出错误,所以我发现在 java8 中是否有类似 UnaryOperator.identity() 的 BinaryOperator 的东西
【问题讨论】:
-
一个身份,根据定义,返回其输入而不做任何修改。如果输入是两个值,那么它的输出也必须是两个值。您想要的不是身份,而是在处理值之前进行的某种不同或组操作。 (我不会说现代 Java,但在 C# 中,这实际上是
.Distinct和.GroupBy。) -
问题不在于您的代码,而在于声纳警报。把它关掉就行了。
-
一些函数式语言只有一元函数。在这些语言中,接受元组的函数等效于 Java 中的二进制函数。当您以这种方式考虑时,这样一个函数的标识很容易:如果一个元组是输入,它也必须是输出。
标签: java lambda java-8 functional-programming