2017-05-08 6 views
3

処理しようとしているJPAリポジトリにいくつかのデータが格納されています。私はJava 8 Streamsを使用することができますが、必要な情報を取得する方法を理解することはできません。この特定の「エンティティ」は実際にはリカバリのためのものなので、停電や再起動の後に処理する必要のあるアイテムが保持されます。問題は、一番最後に呼ばれる2つのパラメータ法から生じるJava 8ストリームでマッピング・パイプラインから複数のアイテムを使用できるか

List<MyEntity> deletes = myEntityJpaRepository.findByDeletes(); 
    for (MyEntity item : deletes) { 
     String itemJson = item.getData(); 
     // use a Jackson 'objectMapper' already setup to de-serialize 
     MyEventClass deleteEvent = objectMapper.readValue(itemJson, MyEventClass.class); 
     processDelete(deleteEvent, item.getId());     
    } 

:forループのコードは次のようになり前のJava 8を使用して

。ストリームを使用して、私は私がするだろうと信じて:

//  deletes.stream() 
//    .map(i -> i.getData()) 
//    .map(event -> objectMapper.readValue(event, MyEventClass.class)) 
//    .forEach(??? can't get 'id' here to invoke 2 parameter method); 

私は、私が一緒に暮らすことができます(ストリームなし)解決策を持っています。しかし、私はこの問題がたくさん出てくると思うので、私の質問は:一般的には、私がしようとしていることを達成するためにStreamsを使用する方法がありますか?

あなた map操作上の

答えて

3

なぜPairリターン:私はこれをコンパイルしていなかったので、修正するマイナーなものがあるかもしれない

.map(i -> new Pair<>(i.getData(), i.getId())) 
.map(pair -> new Pair<>(objectMapper.readValue(pair.getLeft(), MyEventClass.class), pair.getRight()) 
.forEach(p -> processDelete(pair.getLeft(), pair.getRight())) 

。しかし、一般的には、そのような場合にオブジェクトを次の段階に渡すにはHolderが必要です。 Pairまたは何らかの種類、さらにはarrayのいずれかです。

+0

申し訳ありませんが、私は「ホルダー」に関する注釈を見逃しました。私はそれが最高の答えだと思います。最初は、私は「ペア」が好きではなかった。なぜなら、それは拡大縮小していない(はい、私は「トリプル」について知っている)、そこにはないかもしれない関係も伝えているからだ。 「ホルダー」は、IMOの最も一般的な解決策です。 – JoeG

+0

@JoeGを参考にしてください。http://stackoverflow.com/questions/43973776/what-is-equivalent-to-c-sharp-select-clause-in-java-streams/43983558#43983558絶対に重要な方法ではありません。 – Eugene

1

これは、少なくとも開始され、私はそれはあなたがストリームを使いたい理由に依存していると思いますし、どのくらいあなたはそれをより機能的にしたい

List<MyEntity> deletes = myEntityJpaRepository.findByDeletes(); 
deletes.stream().foreach(item -> { 
    String itemJson = item.getData(); 
    // use a Jackson 'objectMapper' already setup to de-serialize 
    MyEventClass deleteEvent = objectMapper.readValue(itemJson, MyEventClass.class); 
    processDelete(deleteEvent, item.getId());     
}); 
3

なぜ単純にこの方法でそれをやっていませんか?

deletes.forEach(item -> 
    processDelete(objectMapper.readValue(item.getData(), MyEventClass.class), 
        item.getId())); 
+0

これは、私の特定の問題の「最良の」解決策です。しかし、私はそれが「一般的な」解決策ではないと考えています。 – JoeG

関連する問題