Java BinaryOperator 和工厂方法。如何返回第一个参数?

Vol*_*ozo 0 java collections lambda java-8 java-stream

我试图通过下一个代码将我的流转换为映射:

Collectors.toMap(City::key, Function.identity(), (first, second) -> first)
Run Code Online (Sandbox Code Playgroud)

我关于最后一个 lambda 的问题。

(first, second) -> first
Run Code Online (Sandbox Code Playgroud)

如果发生碰撞,我经常需要获取任何元素或始终获取第一个元素。我明白,这已经是简短而清晰的形式。但是还是。对于Function类,我们有工厂方法Function.identity(),它按原样返回传递的参数。我们有 forBiFunction或 for的工厂方法BinaryOperator吗?或者可能是接近Function.identity(). 我也知道BinaryOperator.minBy()BinaryOperator.maxBy(),但他们更“详细”,而不是比如此清晰的方法Function.identity()

ETO*_*ETO 7

您可以轻松声明自己的方法:

public class BinaryOperators {
    
    public static <T> BinaryOperator<T> first() {
        return (first, second) -> first;
    }

    public static <T> BinaryOperator<T> second() {
        return (first, second) -> second;
    }

    public static <T> BinaryOperator<T> any() {
        return (first, second) -> ThreadLocalRandom.current().nextBoolean() ? first : second;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后在您的代码中使用它们:

Collectors.toMap(City::key, Function.identity(), BinaryOperators.first())
Run Code Online (Sandbox Code Playgroud)

静态导入:

Collectors.toMap(City::key, identity(), first())
Run Code Online (Sandbox Code Playgroud)

或者只是不要打扰上面的代码并使用(a, b) -> a

toMap(City::key, identity(), (a, b) -> a))
Run Code Online (Sandbox Code Playgroud)

非常清晰简洁,IMO

  • 当然还有: `public static &lt;T&gt; BinaryOperator&lt;T&gt;surpriseMe() { return (a, b) -&gt; ThreadLocalRandom.current().nextBoolean() ?甲:乙;}` (2认同)