私は2つのレベルの深リストを入れ子になったオブジェクトを処理しようとしています。例えば、私のオブジェクトは、このようなものに分けることができます。
TopLevel: [
MidLevel: [
LowLevel,
LowLevel,
.
.
],
MidLevel: [
LowLevel,
LowLevel,
.
.
]
.
.
]
基本的にTopLevel
のリストが含まれMidLevel
順番に、それぞれがリスト含まれているオブジェクト、LowLevel
オブジェクトを。処理の終わりに、私が構築したいSomeObj
の各LowLevel
オブジェクト。しかしSomeObj
からの情報を必要とするTopLevel
、MidLevel
とLowLevel
。
私は私の最初の考えは、私は、オブジェクトの各レベルの上に構築することができると高階関数を作成することでしたので、過去数ヶ月にわたり、より機能的なスタイルでコードを書くしようとしています。この関数は次のようになります。
Function<MidLevel, Function<LowLevel, SomeObj>> buildObjects(TopLevel topLevel) {
return midLevel ->
lowLevel -> {
return buildSomeObj(topLevel, midLevel, lowLevel);
};
}
私は、次のようないくつかの方法でこの機能を使用する(私はリストのストリームを提供ユーティリティ機能を持っていると仮定):
Function<MidLevel, Function<LowLevel, SomeObj>> topBuilder = buildObjects(topLevel);
List<SomeObj> objs = topLevel.streamMid()
.map(topBuilder)
.streamLow()
.map(Function::apply)
.collect(/*collect to list*/);
私は適用されたらしかし、これは明らかに動作しませんMidLevel
にオブジェクトをtopBuilder
機能私の流れは今の機能の流れではなくMidLevel
オブジェクト、したがって、私はのリストにアクセスする必要はありませんLowLevel
もう、ストリーム内のオブジェクトを。
これに対するいかなる解決策はあるのか、私はそれに適していないとき、機能的にこれを解決しようとしていますか?両方の方法は、関数を適用し、また、その機能に適用された元のオブジェクトへのアクセス権を持ってありますか?
flatMap()
そして、ネストが進むべき道です。これを試して:
topLevelStream() //create a stream of top level elements
.flatMap( top -> top.streamMid() //create a stream of mid level elements
.flatMap( mid -> mid.streamLow() //create a stream of low level elements
.map(low -> "use top, mid and low here")
)
)
.collect( ... );
このようにネストすることによって、あなたはまだ外の機能との組み合わせで構成要素へのアクセス権を持っているflatMap()
し、map()
ストリーム公開するmap()
ために呼び出されるがcollect()
。