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是的,但我只想使函数灵活扩展。