2013-03-23 171 views
0

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

下面是一些测试代码,我创建:

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; 
} 

} 

我传递一个字符串[]类型期待它知道如何转换为ArrayList中,但它失败。

回答

2

这是因为我不通用的答案通常与豆一起工作。这可能是BeanUtils 应该处理这种情况,但它会让我感到惊讶。

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

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

  • 相反,如果你真的想要一个ArrayList,您可以构建一个基于关你得到了List对象,有一个新问题:

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

    这个调用分配一个新的存储阵列,但如果你想调整大小,你必须接受O(n)的成本。

这两个可能的选择,这两者都取决于你的使用情况同样有效的,是完全为什么它会是一个糟糕的主意,你的bean隐式转换为数组List - 它应该选择哪种实现?如果您尝试调整大小,会抛出异常,或者速度较慢的那个速度较慢?

只要有可能,明确您的类型转换。尽管冗长看似/令人讨厌,但这是Java最强大的特性之一。

+0

好吧,我现在明白了。我将String []更改为ArrayList ,并且代码没有错误地运行。从String []转换为ArrayList 时,BeanUtils故意失败。作为Java中的HttpServletRequest类返回String或String []类型的后续问题,那么是否强制我在我的bean中仅使用基本类型和String []类型? – user2191540 2013-03-23 22:42:00

+0

“HttpServletRequest”的哪个方法?它并不强迫你,但是,如果在bean中传递的数据类型是一个String [],那么在你的bean中使用数组可能是有意义的,然后当它们转换为List对象时你需要。或者,做一些预处理。在将映射传递给BeanUtils.populate之前,请构建要使用的'List'对象,并将其放入映射中。 – dimo414 2013-03-23 22:54:59

+0

啊...预处理是一个好主意,我会尝试一下。感谢您的建议。 – user2191540 2013-03-23 23:42:52

1

你没有提及究竟失败在你的代码,但在这里是如何转换字符串数组没有任何第三方实用程序列表:

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

相关问题