Java可以将变量映射到对象的方法

时间:2017-10-20 17:25:13

标签: java

我有“1 = xyz,2 = zyx,3 = blah”形式的字符串,以及一个对象

public class Foo{
    String a,b,c
    /*gets and sets*/
}

我想实例化这个对象,使a = xyz,b = zyx,c = blah。到目前为止我所拥有的是,

for(String[] split1 : originalString.split(","){
    for(String[] split2 : split1.split("="){
        if(split2[0] == 1){foo.setA(split2[1])}
        if(split2[0] == 2 {...}
    }
}

而我想知道的是,有一种更简洁的方法来做这件事而不是使用bajillion if语句吗?有没有办法在我的pojo中用setter创建原始列表中的键之间的Map?

我发现了一些较老的问题,但我想知道java 8是否可能为此添加了一些东西。我不想使用反射(我也不应该)

3 个答案:

答案 0 :(得分:2)

是的,您可以使用Map<String, BiConsumer<Foo, String>>

public class StringProcessor {
    private final Map<String, BiConsumer<Foo, String>> setMethods;

    public StringProcessor() {
        Map<String, BiConsumer<Foo, String>> methodMap = new HashMap<>();
        methodMap.put("a", Foo::setA);
        methodMap.put("b", Foo::setB);
        methodMap.put("c", Foo::setC);

        this.setMethods = Collections.unmodifiableMap(methodMap);
    }

    // ...

    public void processString(String originalString,
                              Foo foo) {

        for (String[] split1 : originalString.split(",")) {
            for (String[] split2 : split1.split("=")) {
                BiConsumer<Foo, String> setMethod = setMethods.get(split2[0]);
                setMethod.accept(foo, split2[1]);
            }
        }

    }
}

您也可以使用反射,但最好避免使用反射,因为反射会使错误更难以检测,并且JIT在运行时不太可能对其进行优化。

答案 1 :(得分:0)

我创建了一个类似1 =&#34; a&#34;,2 =&#34; b&#34;,3 =&#34; c&#34;的地图,并用它将密钥转换为pojo的字段名称。

然后我使用了Gson的以下内容

Gson gson = new Gson();
JsonElement jsonElement = gson.toJsonTree(responseMap);
Foo trade = gson.fromJson(jsonElement, Foo.class);

如果我被允许使用groovy,我只需使用默认的基于地图的构造函数。向@chrylis提出建议的方法。

答案 2 :(得分:0)

可以使用正则表达式从输入字符串中删除不需要的字符,然后将其拆分。请注意,输出数组中的String元素可能需要修剪。

import java.util.regex.*;

public class StringRegex{
 public static void main(String[] args){
  String input = "1=xyz,2=zyx,3=blah";
  String notNeeded = "([1234567890=])";      //characters not needed 0-9 and =

  Pattern p = Pattern.compile(notNeeded);
  Matcher m = p.matcher(input);

  String output = m.replaceAll(" ");  //blank out the notNeeded characters
  System.out.println(output);         //gives:   xyz,  zyx,  blah

  String[] outputArr = output.split(",");

  for (String s:outputArr)
    System.out.println(s);
 }
}
相关问题