2016-05-05 4 views
3

コンティニュアはコンポジットオブジェクトです。構造は次のとおりです。Javaマルチマップのオプションの使用

この表記ではそう
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); 
    } 

ことによってそれを呼び出します
portfolio = getFromMapping(continent, null, 
      ((Function<Continent, Country>) Continent::getCountry) 
      ((Function<Country, State>) Country::getState), 
      ((Function<State, Town>) State::getTown)); 

しかし動作しません。マッパは2番目のステップにジャンプし、大陸は国にキャストできないと言った理由は何ですか?マッピングを行っている間にキャストがなくなり、それを修正する方法がありますか?

+2

混乱を避けるために、 'T'と' R'を入れ替えたいかもしれません。 'java.util.function'は' T'と 'U'が入力で' R'が戻り値であるという緩やかな命名規則を持っています。あなたは本質的に 'Function ' –

+0

を構築しています。提案:固定数の関数で 'getFromMapping'のバリアントを作成すると、型保証されたソリューションが得られ、引数をもうキャストする必要はありません。 – stholzm

+0

@ HankDありがとうハンク、私はインターフェイスを修正しました〜 –

答えて

5

Optional#mapはそれ自身を変更するのではなく、新しいOptionalを返します。したがって、sourceWrapperにはまだあなたの大陸が含まれています。変数をforループに再割り当てする必要があります。

sourceWrapper = sourceWrapper.map(function); 
+0

ありがとう!!わかった –

関連する問題