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

ngynwnxp  于 2023-04-10  发布在  Java
关注(0)|答案(1)|浏览(127)

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

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

谢谢。

zwghvu4y

zwghvu4y1#

从设计的Angular 来看,我认为您可以尝试将过滤逻辑封装在这个Attivita类中。
举一个简单的例子,如果你看到这样的东西:pawn.setPosition(pawn.getPosition() + x)这是一个被称为“feature envy”的反模式,它表明该逻辑属于Pawn类:pawn.advance(x)
在您的情况下,也许可以添加类似activita.filterLavorazioniById(idIstanza)的内容
在性能方面,这些集合有多大?如果它们不是很大,那么使用并行流的开销可能不值得,特别是当您使用可变数据时。
正如注解中所建议的,如果你想安全地并行处理这些集合,使用不可变对象可能是一个好主意。所以,如果你引入这个filterLavorazioniById()方法,它可能会返回一个新的activita和过滤后的数据。最终的代码可能看起来像这样:

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

相关问题