You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:45:59