发布于2026-07-02 阅读(0)
扫一扫,手机访问
如何优雅、安全地过滤嵌套列表?在 Ja va 开发中,处理“父对象列表 + 每个父对象持有一个子对象列表”这类结构,并按条件(比如 idIstanza)过滤子项,是常见但稍不留神就会踩坑的场景。

先看看一种常见的写法——用 peek() 或 map() 搭配 parallelStream(),直接在原对象上修改内部列表:
.map(attivita -> { attivita.setListaLa vorazioni( attivita.getListaLa vorazioni().stream() .filter(l -> l.getIstanza().getId().equals(idIstanza)) .collect(Collectors.toList()) ); return attivita;})
这段代码看起来简洁,但其实藏着好几个隐患:
parallelStream(),多个线程会并发调用 setListaLa vorazioni()。如果 Attivita 是共享的可变对象,竞态条件几乎是必然的。peek() 本来只适合调试(看看中间结果),不该承担业务逻辑;map() 虽然合法,但在原对象上做突变(mutating)操作,破坏了不可变性。parallelStream() 的线程调度和拆分开销比顺序流还高,得不偿失。一个更靠谱的做法是:把过滤逻辑内聚到 Attivita 类里,遵循“信息专家”原则——逻辑就应该待在数据所在的地方,避免外部直接侵入内部结构。
// Attivita.ja va —— 封装子列表过滤能力,返回新实例(推荐不可变设计)
public Attivita filterLa vorazioniById(Long idIstanza) {
List filtered = this.listaLa vorazioni.stream()
.filter(l -> Objects.equals(l.getIstanza().getId(), idIstanza)) // 用 Objects.equals 防 NPE
.toList(); // Ja va 16+,或 collect(Collectors.toList())
// 方式1:若 Attivita 支持构建器(推荐)
return new Attivita.Builder(this)
.withListaLa vorazioni(filtered)
.build();
// 方式2:若为 record 或不可变类(Ja va 14+)
// return new Attivita(this.id, this.nome, filtered, ...);
}
服务层的代码就变成了这样——清晰、安全、可读性拉满:
@CachePut(value = "sdipp-cache") public ListottieniListaAttivita(String prefixCall, Long idIstanza) throws DefaultException { return servizioGenerico.ottieniCall(prefixCall) .getListaAttivita() .stream() // ✅ 默认顺序流已足够,除非列表 > 10k 且子列表极长 .map(attivita -> attivita.filterLa vorazioniById(idIstanza)) .collect(Collectors.toList()); }
parallelStream() 只有在数据量很大(比如父列表 ≥ 10,000)、子列表计算密集(涉及复杂 I/O 或 CPU 运算)时才划算。日常业务场景,顺序流就足够了。la vorazione.getIstanza() 或 .getId() 可能为 null,务必用 Objects.equals() 替代直接 == 或 .equals() 调用,防止空指针捣乱。Attivita 改造成不可变类,至少确保 filterLa vorazioniById() 返回新对象,而不是修改原对象——这是并发安全的基石。@CachePut 作用在整个 List 上,如果后续需要更细粒度的缓存(比如按 idIstanza 缓存子列表),可以把 filterLa vorazioniById() 提升为独立的缓存方法。把领域逻辑下沉到实体类、拥抱不可变性、再用流式组合起来——这样做出来的代码不仅更健壮、更容易测试,也让并行处理从“风险操作”变成了“自然选择”。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8