You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java Stream根据条件更新嵌套列表对象的属性

问题场景与解决方案

实体类定义

Test.java

private String name; // 注:原代码字段名为Names,结合数据示例调整为name
private List<InnerList> innerlist = new ArrayList<InnerList>();

InnerList.java

private String id;
private Long x;
private Long y;

数据示例

[class Test {
    Name: test
    innerlist: [class Innerlist{
        id: 1
        x: 0
        y: 0
    }]
}]

现有列表

List<Test> list = new ArrayList<Test>();

需求

根据「Name匹配为"Test"且innerlist中id匹配为1」的条件,更新对应InnerList对象的x或y属性。

当前代码问题

已编写部分代码,但无法添加内部列表的条件判断,也不清楚如何调用setter方法更新属性:

list.stream().filter(u->u.getName().equals("Test")).filter(t1->t1.getInnerList());

解决方案

方案1:分层过滤+遍历更新

先筛选出符合Name条件的Test对象,再遍历其内部列表找到匹配id的元素进行更新:

list.stream()
    // 过滤Name为"Test"的Test实例
    .filter(test -> "Test".equals(test.getName()))
    .forEach(test -> {
        test.getInnerlist().stream()
            // 过滤id为"1"的InnerList实例
            .filter(inner -> "1".equals(inner.getId()))
            // 执行属性更新,示例为修改x和y的值
            .forEach(inner -> {
                inner.setX(100L);
                inner.setY(200L);
            });
    });

方案2:用flatMap直接定位目标元素

通过flatMap将嵌套的InnerList展开,直接筛选并更新目标元素:

list.stream()
    .filter(test -> "Test".equals(test.getName()))
    .flatMap(test -> test.getInnerlist().stream())
    .filter(inner -> "1".equals(inner.getId()))
    .forEach(inner -> {
        inner.setX(100L);
        inner.setY(200L);
    });

优化点:匹配首个元素

如果只需要更新第一个符合条件的InnerList,可改用findFirst()避免遍历全部元素:

list.stream()
    .filter(test -> "Test".equals(test.getName()))
    .flatMap(test -> test.getInnerlist().stream())
    .filter(inner -> "1".equals(inner.getId()))
    .findFirst()
    .ifPresent(inner -> {
        inner.setX(100L);
        inner.setY(200L);
    });

注意事项

  • 确保实体类已定义对应的getter和setter方法(如getName()、getInnerlist()、getId()、setX()、setY()),否则代码无法编译。
  • 使用"目标值".equals(属性)的写法可避免空指针异常,适合属性可能为null的场景。

内容的提问来源于stack exchange,提问作者karljohnson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:08:14