Android中简化Google Map标记颜色判断条件的方案咨询
简化Google Map标记颜色的条件判断写法
当然可以简化啦!你想的那种在链式调用中间插入if的写法其实在Java里行不通(因为链式调用依赖每个方法返回对象,没法直接在中间插条件语句),不过咱们有几种更优雅的方式来重构这段代码,既简洁又好维护:
方法一:用Switch语句提前确定颜色值
这种方式把重复的Marker构建逻辑抽出来,只在开头判断颜色,代码复用性更高:
for (int i=0; i < response.body().size(); i++) { // 先把当前项取出来,避免重复调用response.body().get(i),提升可读性和性能 var item = response.body().get(i); LatLng place = new LatLng(item.getLatitude(), item.getLongitude()); // 提前根据分类确定标记颜色 float markerHue; switch(item.getCategory()) { case "1": markerHue = BitmapDescriptorFactory.HUE_AZURE; break; case "2": markerHue = BitmapDescriptorFactory.HUE_YELLOW; break; default: markerHue = BitmapDescriptorFactory.HUE_BLUE; } // 统一构建Marker,不用重复写相同的配置 mMap.addMarker(new MarkerOptions() .position(place) .icon(BitmapDescriptorFactory.defaultMarker(markerHue)) .title(item.getName()) .snippet(item.getCategory())) .setTag(item.getSlug()); }
方法二:用Map映射分类与颜色(适合分类较多的场景)
如果以后要加更多分类,switch会变得冗长,用Map来做键值对映射会更清晰,还能动态调整:
// 可以把这个映射放在类的成员变量里,初始化一次即可,不用每次循环都创建 private final Map<String, Float> categoryHueMap = new HashMap<>() {{ put("1", BitmapDescriptorFactory.HUE_AZURE); put("2", BitmapDescriptorFactory.HUE_YELLOW); }}; // 循环里的代码 for (int i=0; i < response.body().size(); i++) { var item = response.body().get(i); LatLng place = new LatLng(item.getLatitude(), item.getLongitude()); // 用getOrDefault直接获取颜色,没有匹配的就用默认蓝色 float markerHue = categoryHueMap.getOrDefault(item.getCategory(), BitmapDescriptorFactory.HUE_BLUE); mMap.addMarker(new MarkerOptions() .position(place) .icon(BitmapDescriptorFactory.defaultMarker(markerHue)) .title(item.getName()) .snippet(item.getCategory())) .setTag(item.getSlug()); }
补充:用三元运算符(仅适合简单场景)
如果只有两三个分类,也可以用三元运算符在链式调用里直接判断,但分类多了会嵌套太严重,可读性差,仅作参考:
for (int i=0; i < response.body().size(); i++) { var item = response.body().get(i); LatLng place = new LatLng(item.getLatitude(), item.getLongitude()); mMap.addMarker(new MarkerOptions() .position(place) .icon(BitmapDescriptorFactory.defaultMarker( item.getCategory().equals("1") ? BitmapDescriptorFactory.HUE_AZURE : item.getCategory().equals("2") ? BitmapDescriptorFactory.HUE_YELLOW : BitmapDescriptorFactory.HUE_BLUE )) .title(item.getName()) .snippet(item.getCategory())) .setTag(item.getSlug()); }
内容的提问来源于stack exchange,提问作者wwwrrrxxx
相关产品推荐
相关产品推荐

