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

Kotlin中遍历Place AddressComponents列表获取指定层级行政区信息

问题描述

从Google Maps SDK for Android获取地点的Place Detail后,得到由多个AddressComponent组成的列表。示例返回结果如下:

Place found: AddressComponents{asList=[AddressComponent{name=58, shortName=58, types=[street_number]}, AddressComponent{name=Schwertstraße, shortName=Schwertstraße, types=[route]}, AddressComponent{name=Sindelfingen, shortName=Sindelfingen, types=[locality, political]}, AddressComponent{name=Böblingen, shortName=BB, types=[administrative_area_level_3, political]}, AddressComponent{name=Stuttgart, shortName=Süd, types=[administrative_area_level_2, political]}, AddressComponent{name=Baden-Württemberg, shortName=BW, types=[administrative_area_level_1, political]}, AddressComponent{name=Deutschland, shortName=DE, types=[country, political]}, AddressComponent{name=71065, shortName=71065, types=[postal_code]}]}

需要获取类型为administrative_area_level_1和administrative_area_level_2的信息,但当前只能通过硬编码索引取值:

System.out.println(place.addressComponents?.asList()?.get(5)?.name)
System.out.println(place.addressComponents?.asList()?.get(5)?.shortName)

返回结果:

Baden-Württemberg
BW

但AddressComponent的位置会随API请求变化,部分地点信息还可能不全,硬编码索引不可行。如何不依赖组件位置、忽略顺序,获取指定类型的信息?

解决方案

不要依赖索引,而是遍历AddressComponent列表,根据types字段匹配目标类型。可以封装工具方法实现:

Java 示例代码

// 根据目标类型查找对应的AddressComponent
private AddressComponent getAddressComponentByType(List<AddressComponent> components, String targetType) {
    if (components == null || components.isEmpty()) {
        return null;
    }
    for (AddressComponent component : components) {
        if (component.getTypes().contains(targetType)) {
            return component;
        }
    }
    return null;
}

// 使用示例
List<AddressComponent> addressComponents = place.getAddressComponents().asList();

// 获取administrative_area_level_1信息
AddressComponent level1Component = getAddressComponentByType(addressComponents, "administrative_area_level_1");
if (level1Component != null) {
    System.out.println(level1Component.getName());
    System.out.println(level1Component.getShortName());
}

// 获取administrative_area_level_2信息
AddressComponent level2Component = getAddressComponentByType(addressComponents, "administrative_area_level_2");
if (level2Component != null) {
    System.out.println(level2Component.getName());
    System.out.println(level2Component.getShortName());
}

Kotlin 示例代码

// 扩展函数简化查找逻辑
fun List<AddressComponent>.getByType(targetType: String): AddressComponent? {
    return firstOrNull { it.types.contains(targetType) }
}

// 使用示例
val addressComponents = place.addressComponents?.asList() ?: emptyList()

// 获取administrative_area_level_1信息
addressComponents.getByType("administrative_area_level_1")?.let {
    println(it.name)
    println(it.shortName)
}

// 获取administrative_area_level_2信息
addressComponents.getByType("administrative_area_level_2")?.let {
    println(it.name)
    println(it.shortName)
}

核心逻辑说明

  • 遍历所有AddressComponent,检查每个组件的types列表是否包含目标类型
  • 找到匹配项后直接返回,完全不依赖组件在列表中的位置
  • 加入空值判断,避免因地点信息缺失导致的空指针异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:31:52