2017-05-08 35 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

相关问题