2017-05-08 67 views
3

我有一些數據存儲在我嘗試處理的JPA存儲庫中。我希望能夠使用Java 8 Streams來做到這一點,但無法弄清楚如何獲得所需的信息。這個特殊的「實體」實際上只是用於恢復,因此它包含了在電源故障/重啓之類的事情之後需要處理的項目。Java 8 Streams是否可以使用映射管道中的多個項目

使用前的Java 8 for循環的代碼是這樣:

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

的問題,從所謂的在最後兩個參數的方法出現。使用流,我相信我會這樣做:

//  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來完成我想要做的事情的方法?

回答

3

爲什麼不Pair回報您的map操作:

.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

對不起,我錯過了關於'持有人'的說明。我認爲這是最好的答案。起初,我不喜歡「Pair」,因爲它不會擴展(是的,我知道'Triple'),也傳達了一種可能不存在的關係。持有人似乎是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

相關問題