繁体   English   中英

Java var 类型推断泛型参数类型

[英]Java var type inference on generic parameter type

我有一个 stream 收集器的合并功能,并试图使其通用。 由于 lambda 接受 var 作为参数类型并且结果类型是 BinaryOperator,因此我试图获得类似 BinaryOperator<?> 或类似的东西。

BinaryOperator<InsertYourFavouriteType> rejectNewValueAndWarn = (oldValue, newValue ) -> {
            LOGGER.warn( "Old value already present in map, rejecting to collect new value" );
            LOGGER.warn( "Old value:" + oldValue );
            LOGGER.warn( "New value:" + newValue );
            return oldValue;
        };

这已经非常通用,但我想摆脱 generics 参数中的显式类型。

您不能直接使用变量1执行此操作,但完全可以使用以下方法:

public final class Rejecter {
    public static <T> T rejectNewValueAndWarn(T oldValue, T newValue) {
        LOGGER.warn("Old value already present in map, rejecting to collect new value");
        LOGGER.warn("Old value:" + oldValue);
        LOGGER.warn("New value:" + newValue);
        return oldValue;
    }
}

然后您可以使用方法引用直接引用该方法:

Map<A, B> map = whatever.stream()
    .collect(Collectors.toMap(
        ..., // your key mapper
        ..., // your value mapper
        Rejecter::rejectNewValueAndWarn // the merge function
    ));

1您可以将通用参数定义为? Object ,但是您需要针对每种用法进行强制转换,例如(BinaryOperator<SomeType>) rejectNewValueAndWarn ,这有效地消除了将这个逻辑提取到一个公共位置的整个目的。

好的,在 generics 类型作为类型参数的提示之后,我想出了一个定义如下的合并函数:

static < K > BinaryOperator< K > mergeFunction()
    {
        BinaryOperator< K > rejectNewValueAndWarn = ( oldValue, newValue ) -> {
            LOGGER.warn( "Old value already present in map, rejecting to collect new value" );
            LOGGER.warn( "Old value:" + oldValue );
            LOGGER.warn( "New value:" + newValue );
            return oldValue;
        };
        return rejectNewValueAndWarn;
    }

blablaList.
            .stream()
            .collect( Collectors.toMap( AbstractDto::getName, Function.identity(), mergeFunction() ) );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM