BinaryOperator的标识

Kar*_*y L 7 java lambda functional-programming java-8

我在Java8的UnaryOperator接口中看到了一段代码,它对参数没有任何作用并返回相同的值.

static <T> UnaryOperator<T> identity() {
    return t -> t;
}
Run Code Online (Sandbox Code Playgroud)

BinaryOperator有什么东西可以接受samekind的两个参数并返回一个值

static <T> BinaryOperator<T> identity() {
    return (t,t) -> t;
}
Run Code Online (Sandbox Code Playgroud)

为什么我问这个问题是针对以下要求,

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());
Run Code Online (Sandbox Code Playgroud)

在上面的代码我不想为同一个键的两个值做任何事情,我只想返回一个值,因为在我的情况下肯定值将是相同的.由于我没有使用t2值声纳投掷错误,所以我发现在java8中也存在像BinaryOpertor的UnaryOperator.identity()这样的东西

Mic*_*ael 6

你的问题没有意义.如果您要将建议的BinaryOperator.identity方法粘贴到IDE中,您会立即看到它会抱怨标识符t被声明两次.

要解决这个问题,我们需要为每个参数设置不同的标识符:

return (t, u) -> t;
Run Code Online (Sandbox Code Playgroud)

现在我们可以清楚地看到这不是一个身份功能.这是一个接受两个参数并返回第一个参数的方法.因此,最好的名字就是这样的getFirst.

回答你关于JDK中是否有这样的问题:没有.使用标识函数是一种常见的用例,因此为此定义方法很有用.任意返回两个第一个参数并不是一个常见的用例,并且有一个方法可以做到这一点.


Eug*_*ene 4

T意味着它们具有相同的类型,而不是相同的,这本身不是一个身份。

它只是意味着BinaryOperator将用于相同的类型,但提供identity不同的值...这在某种程度上听起来像foldLeftor foldRightor foldLeftIdentity/foldRightIdentity,而 java 没有。