[英]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.