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

Java 8如何查找给定属性的最长字符串,支持嵌套对象及列表遍历

功能实现方案

你可以通过反射递归遍历所有对象的字段(包括嵌套对象、列表内的对象),收集所有匹配属性名的字符串值,再筛选出长度最长的结果即可,具体实现如下:

完整代码实现

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

// 假设employeeList是当前类的成员变量,存储所有Employee实例
private List<Employee> employeeList;

private String findStringWithMaxLength(String attribute) {
    // 收集所有匹配属性名的非空字符串
    List<String> matchedValues = new ArrayList<>();
    for (Employee employee : employeeList) {
        extractMatchedValues(employee, attribute, matchedValues);
    }
    // 按长度降序取最大值,无匹配值时返回null可按需调整
    return matchedValues.stream()
            .filter(Objects::nonNull)
            .max((s1, s2) -> s1.length() - s2.length())
            .orElse(null);
}

/**
 * 递归提取对象中匹配属性名的字符串值
 * @param obj 待遍历的对象
 * @param targetAttribute 目标属性名
 * @param result 收集结果的集合
 */
private void extractMatchedValues(Object obj, String targetAttribute, List<String> result) {
    if (obj == null) {
        return;
    }
    Class<?> clazz = obj.getClass();
    // 跳过基础类型、包装类、字符串类本身
    if (clazz.isPrimitive() || clazz == String.class || Number.class.isAssignableFrom(clazz) || Boolean.class.isAssignableFrom(clazz)) {
        return;
    }
    // 处理集合类型
    if (Iterable.class.isAssignableFrom(clazz)) {
        Iterable<?> iterable = (Iterable<?>) obj;
        for (Object item : iterable) {
            extractMatchedValues(item, targetAttribute, result);
        }
        return;
    }
    // 处理数组类型
    if (clazz.isArray()) {
        Object[] array = (Object[]) obj;
        for (Object item : array) {
            extractMatchedValues(item, targetAttribute, result);
        }
        return;
    }
    // 遍历当前对象的所有字段
    Field[] fields = clazz.getDeclaredFields();
    for (Field field : fields) {
        field.setAccessible(true);
        try {
            Object fieldValue = field.get(obj);
            if (fieldValue == null) {
                continue;
            }
            // 字段名匹配且为String类型直接加入结果
            if (field.getName().equals(targetAttribute) && field.getType() == String.class) {
                result.add((String) fieldValue);
                continue;
            }
            // 其他类型递归处理
            extractMatchedValues(fieldValue, targetAttribute, result);
        } catch (IllegalAccessException e) {
            // 反射异常可按需处理,这里仅打印日志跳过
            e.printStackTrace();
        }
    }
}

逻辑说明

  • 递归方法自动处理所有层级的嵌套结构:不管是Employee的直接属性(比如name、designation)、嵌套对象ContactInfo的属性,还是address列表中每个Address对象的属性,都会被完整遍历
  • 匹配逻辑严格对比字段名和传入的属性名,只有String类型的匹配字段才会被收集
  • 自动过滤空值,避免空指针异常
  • 最终对所有收集到的字符串按长度排序,返回最长的结果,没有匹配值时返回null,可根据业务需求调整默认返回值

验证示例

按照你提供的测试数据,传入属性值"city"时,方法会遍历到address1的city111和address2的city111111,最终返回长度更长的city111111,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:39:01