如何将Retrofit返回的多个strIngredient值存入ArrayList
从Cocktail POJO提取配料字段到ArrayList的解决方案
针对你已经定义好的Cocktail类,我给你两种实用的方法来把strIngredient1到strIngredient15的有效值提取到ArrayList<String>里:
方法一:手动逐个检查添加(直观易维护)
这种方法适合字段数量不多的场景,代码直白,不容易出错:
public List<String> getIngredientsList(Cocktail cocktail) { List<String> ingredients = new ArrayList<>(); // 逐个检查每个配料字段,非空非空白字符串才加入列表 addIfValid(ingredients, cocktail.getStrIngredient1()); addIfValid(ingredients, cocktail.getStrIngredient2()); addIfValid(ingredients, cocktail.getStrIngredient3()); addIfValid(ingredients, cocktail.getStrIngredient4()); addIfValid(ingredients, cocktail.getStrIngredient5()); addIfValid(ingredients, cocktail.getStrIngredient6()); addIfValid(ingredients, cocktail.getStrIngredient7()); addIfValid(ingredients, cocktail.getStrIngredient8()); addIfValid(ingredients, cocktail.getStrIngredient9()); addIfValid(ingredients, cocktail.getStrIngredient10()); addIfValid(ingredients, cocktail.getStrIngredient11()); addIfValid(ingredients, cocktail.getStrIngredient12()); addIfValid(ingredients, cocktail.getStrIngredient13()); addIfValid(ingredients, cocktail.getStrIngredient14()); addIfValid(ingredients, cocktail.getStrIngredient15()); return ingredients; } // 辅助方法:判断字符串是否有效(非null且非空白),有效则加入列表 private void addIfValid(List<String> list, String value) { if (value != null && !value.trim().isEmpty()) { list.add(value.trim()); } }
方法二:用反射简化代码(适合字段数量多的情况)
如果后续可能增加更多配料字段,反射可以避免重复的getter调用,自动遍历规律命名的字段:
import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public List<String> getIngredientsListWithReflection(Cocktail cocktail) { List<String> ingredients = new ArrayList<>(); Class<?> cocktailClass = cocktail.getClass(); // 遍历1到15的配料字段 for (int i = 1; i <= 15; i++) { try { // 拼接getter方法名,比如getStrIngredient1 String methodName = "getStrIngredient" + i; Method getter = cocktailClass.getMethod(methodName); String ingredient = (String) getter.invoke(cocktail); // 同样只添加有效值 if (ingredient != null && !ingredient.trim().isEmpty()) { ingredients.add(ingredient.trim()); } } catch (Exception e) { // 捕获反射异常,比如字段不存在时跳过 e.printStackTrace(); } } return ingredients; }
使用提示
- 如果你不需要过滤空值,可以去掉
addIfValid或者反射里的判断逻辑,直接添加所有字段值(包括null)。 - 反射方法虽然简洁,但性能略低于手动调用,不过在这种场景下差异可以忽略不计。
内容的提问来源于stack exchange,提问作者JakeB
相关产品推荐
相关产品推荐

