0

如何使用 BeanUtils.populate 方法从 String[] 转换为 ArrayList?看起来我可以使用 ArrayConverter 类,但我很难找到关于如何做到这一点的解释。

这是我创建的一些测试代码:

public class TestAction {
public static TestBean testPopulate() throws IllegalAccessException, InvocationTargetException {
    HashMap<String, Object> map = new HashMap<String, Object>();
    TestBean bean = new TestBean();
    String[] names = {"teststring","testboolean","testinteger","testarray"};
    String[] array = {"hi","bye"};
    Object[] values = {"TEST","","100",array};
    int i = 0;
    while (i < names.length) {
        String name = names[i];
        map.put(name, values[i]);
        i++;
    }
    BeanUtils.populate(bean, map);

    return bean;
}

public static void main(String[] args) {
    try {
        TestBean bean = testPopulate();
        System.out.println(bean.getTeststring() + " " + bean.getTestinteger() + " " + bean.getTeststring() + " " + bean.isTestboolean());
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

public class TestBean {
private String teststring;
private boolean testboolean;
private int testinteger;
private ArrayList<String> testarray;

public String getTeststring() {
    return teststring;
}
public void setTeststring(String teststring) {
    this.teststring = teststring;
}
public boolean isTestboolean() {
    return testboolean;
}
public void setTestboolean(boolean testboolean) {
    this.testboolean = testboolean;
}
public int getTestinteger() {
    return testinteger;
}
public void setTestinteger(int testinteger) {
    this.testinteger = testinteger;
}
public ArrayList<String> getTestarray() {
    return testarray;
}
public void setTestarray(ArrayList<String> testarray) {
    this.testarray = testarray;
}

}

我传入一个 String[] 类型,希望它知道如何转换为 ArrayList,但它失败了。

4

2 回答 2

2

这是一个通用的答案,因为我通常不使用 Beans。BeanUtils 可能应该处理这种情况,但这会让我感到惊讶。

字符串数组与 ArrayList 对象不同,尽管它们有相似之处。隐式地从一个转换到另一个通常是一个糟糕的主意,因为有多种逻辑方式可以完成。

  • 您可以使用Arrays.asList()which 接受一个数组并返回一个包装器List对象。请注意,它不是一个ArrayList,而是一个固定大小的自定义实现,List它直接与传递的数组接口,这意味着不必分配新的存储空间。

  • 相反,如果你真的想要一个ArrayList,你可以根据你得到的对象构造一个新的List,使用:

    ArrayList<String> ls = new ArrayList<String>(Arrays.asList(myArray));
    

    这个调用确实分配了一个新的存储数组,但如果你想要调整大小,你必须接受 O(n) 成本。

这两种可能的选择,根据你的用例,两者都同样有效,这正是为什么你的 bean 将数组隐式转换为一个糟糕的主意List- 它应该选择哪个实现?如果您尝试调整它的大小,快速的会抛出异常,还是慢的不会?

尽可能明确说明您的类型转换。尽管冗长看起来/令人讨厌,但这是 Java 最强大的功能之一。

于 2013-03-23T22:32:17.120 回答
1

您没有提到代码中到底发生了什么失败,但这里是如何在没有任何第三方实用程序的情况下将字符串数组转换为列表:

Arrays.asList(new String[] {"aaa", "bbb", "ccc"})

于 2013-03-23T22:28:23.617 回答