Javaのストリーミング高階関数

wearebob:

私は2つのレベルの深リストを入れ子になったオブジェクトを処理しようとしています。例えば、私のオブジェクトは、このようなものに分けることができます。

TopLevel: [
    MidLevel: [
        LowLevel,
        LowLevel,
        .
        .
    ],
    MidLevel: [
        LowLevel,
        LowLevel,
        .
        .
    ]
    .
    .
]

基本的にTopLevelのリストが含まれMidLevel順番に、それぞれがリスト含まれているオブジェクト、LowLevelオブジェクトを。処理の終わりに、私が構築したいSomeObjの各LowLevelオブジェクト。しかしSomeObjからの情報を必要とするTopLevelMidLevelLowLevel

私は私の最初の考えは、私は、オブジェクトの各レベルの上に構築することができると高階関数を作成することでしたので、過去数ヶ月にわたり、より機能的なスタイルでコードを書くしようとしています。この関数は次のようになります。

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()

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=185627&siteId=1