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
相关产品推荐
相关产品推荐

