Java多地图的可选用法

Mar*_* Ho 3 lambda optional java-8

Continent是一个复合对象.结构是:

Continent
--Country
----State
------Town
Run Code Online (Sandbox Code Playgroud)

所以用这种表示法:

town= Optional.of(continent)
            .map(Continent::getCountry)
            .map(Country::getState)
            .map(State::getTown)
            .orElse(null);
Run Code Online (Sandbox Code Playgroud)

这工作正常,但当我尝试编写一般的映射器时,

  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);
  }
Run Code Online (Sandbox Code Playgroud)

并通过调用它

 portfolio = getFromMapping(continent, null,
            ((Function<Continent, Country>) Continent::getCountry)
            ((Function<Country, State>) Country::getState),
            ((Function<State, Town>) State::getTown));
Run Code Online (Sandbox Code Playgroud)

它编译得很好,但不起作用.映射器跳到第二步,说大陆无法投放到国家,为什么?做映射时应该没有强制转换,如何解决?

sth*_*lzm 5

Optional#map不修改自己,但返回一个新的Optional,所以sourceWrapper仍然包含你的大陆.您应该在for循环中重新分配变量:

sourceWrapper = sourceWrapper.map(function);
Run Code Online (Sandbox Code Playgroud)