包含子列表的流对象列表需要过滤Java流



我想问你执行下面这段代码的最优雅、最高效的方法是什么:

return servizioGenerico.ottieniCall(prefixCall).getListaAttivita().stream().parallel()
.peek(attivita -> {
attivita.setListaLavorazioni(attivita.getListaLavorazioni().stream().parallel().filter(lavorazione -> lavorazione.getIstanza().getId().equals(idIstanza)).collect(Collectors.toList()));
}).collect(Collectors.toList());

下面的代码遍历一个包含子对象的对象列表,该子对象必须在父流的每个对象上进行过滤和重置。

还发布了一个新版本的代码,使用map:

@CachePut(value="sdipp-cache")
public List<Attivita> ottieniListaAttivita(String prefixCall, Long idIstanza) throws DefaultException {
return servizioGenerico.ottieniCall(prefixCall).getListaAttivita().stream().parallel()
.map(attivita -> filtroLavorazioniAttivitaSuIstanza(attivita, idIstanza)).collect(Collectors.toList());
}
private Attivita filtroLavorazioniAttivitaSuIstanza(Attivita attivita, Long idIstanza) {
attivita.setListaLavorazioni(attivita.getListaLavorazioni().stream().parallel()
.filter(lavorazione -> lavorazione.getIstanza().getId().equals(idIstanza)).collect(Collectors.toList()));
return attivita;
}

谢谢。

从设计的角度来看,我认为您可以尝试将过滤逻辑封装在这个activita类中。

举个简单的例子,如果你看到这样的内容:pawn.setPosition(pawn.getPosition() + x)这是一种被称为"功能羡慕"的反模式。这是一个信号,表明这个逻辑属于Pawn类:pawn.advance(x)

在你的情况下,也许你可以添加一些像activita.filterLavorazioniById(idIstanza)

在性能方面,这些集合有多大?如果它们不是很大,那么使用并行流的开销可能不值得,特别是当您使用可变数据时。

正如在评论中建议的那样,如果你想安全地并行处理这些集合,使用不可变对象可能是一个好主意。因此,如果您引入这个filterLavorazioniById()方法,它可能会返回一个包含过滤数据的新activita。最后的代码看起来像这样:

return servizioGenerico.ottieniCall(prefixCall).getListaAttivita()
.stream().parallel()
.map(attivita -> attivita.filterLavorazioniById(idIstanza)
.collect(Collectors.toList());

最新更新