Lambda 多映射的Java可选用法
大陆是一个复合物体。结构是:Lambda 多映射的Java可选用法,lambda,java-8,optional,Lambda,Java 8,Optional,大陆是一个复合物体。结构是: Continent --Country ----State ------Town 在这个符号中: town= Optional.of(continent) .map(Continent::getCountry) .map(Country::getState) .map(State::getTown) .orElse(null); 这很好,但当我尝试编写一个通用映射程序
Continent
--Country
----State
------Town
在这个符号中:
town= Optional.of(continent)
.map(Continent::getCountry)
.map(Country::getState)
.map(State::getTown)
.orElse(null);
这很好,但当我尝试编写一个通用映射程序时
public static <T, R> T getFromMapping(R source,
T defaultValue,
Function<?,?>... functions) {
Optional sourceWrapper = Optional.ofNullable(source);
for (Function function : functions) {
sourceWrapper.map(function);
}
return (T) sourceWrapper.orElse(defaultValue);
}
publicstatict getFromMapping(R源代码,
T默认值,
功能…功能){
可选sourceWrapper=Optional.ofNullable(源);
for(函数:函数){
map(函数);
}
return(T)sourceWrapper.orElse(defaultValue);
}
并通过
portfolio = getFromMapping(continent, null,
((Function<Continent, Country>) Continent::getCountry)
((Function<Country, State>) Country::getState),
((Function<State, Town>) State::getTown));
portfolio=getFromMapping(大陆,空,
((功能)大陆::getCountry)
((函数)国家::getState),
((函数)状态::getTown));
它很好,但不起作用。地图绘制者跳到第二步,说大陆不能投射到这个国家,为什么?在进行映射时应该没有强制转换,如何修复它?Optional\map
不会修改自身,而是返回一个新的Optional
,因此sourceWrapper
仍然包含您的大陆。您应该在for循环中重新分配变量:
sourceWrapper = sourceWrapper.map(function);
您可能希望交换
T
和R
以避免混淆java.util.function
具有松散的命名约定,T
和U
是输入,R
是返回值。您实际上是在构建一个函数
建议:如果您使用固定数量的函数创建getFromMapping
的变体,您将有一个类型安全解决方案,并且不再需要强制转换参数。@HankD感谢Hank,我已经更正了接口~@stholzm是的,但我只想使函数灵活扩展。