BiFunction是否有类似Function.identity()的左右恒等实现?
Stream收集Map时保留第一个元素的合并函数替代方案
JDK原生复用方案
JDK本身并没有提供像Function.identity()那样直接的BiFunction.left()或BinaryOperator.keepFirst()工具方法,但你可以自己定义一个静态常量来复用这个逻辑,让代码更具语义性:
// 定义可复用的、保留第一个元素的BinaryOperator(适用于输入输出类型相同的场景) private static final <T> BinaryOperator<T> KEEP_FIRST = (x, y) -> x; // 使用示例 Map<Bar, Foo> fooBar = stream .collect(Collectors.toMap( Foo::getBar, Function.identity(), KEEP_FIRST ));
如果需要适配输入输出类型不同的场景,也可以定义通用的BiFunction:
private static final <T, U> BiFunction<T, U, T> KEEP_LEFT = (x, y) -> x;
第三方库实现
如果允许引入外部库,以下几个常用库提供了现成的工具方法:
- Apache Commons Lang3:
BiFunctionUtils类的left()方法直接返回保留第一个参数的BiFunction:import org.apache.commons.lang3.function.BiFunctionUtils; Map<Bar, Foo> fooBar = stream .collect(Collectors.toMap( Foo::getBar, Function.identity(), BiFunctionUtils.left() )); - Vavr(原Javaslang):
Function2接口的left()方法可实现相同逻辑,需强制转换为符合toMap要求的函数类型:import io.vavr.Function2; Map<Bar, Foo> fooBar = stream .collect(Collectors.toMap( Foo::getBar, Function.identity(), (Function2<Foo, Foo, Foo>) Function2::left ));
内容的提问来源于stack exchange,提问作者SwiftMango
相关产品推荐
相关产品推荐

