2013-02-05 129 views
3

我在将字符串列表转换为java中的Bigdecimal列表时遇到问题。将字符串列表转换为java中的BigDecimal列表

我有串状的名单,

List<String> stringList = new LinkedList<String>(); 
stringList.add("123"); 
stringList.add("456"); 
stringList.add("789"); 

和BigDecimal的列表为

List<BigDecimal> bigDecimalList = new LinkedList<BigDecimal>(); 

现在我想stringList转换为bigDecimalList。我知道我们可以遍历stringList,并可以使用new BigDecimal(string)将其添加到bigDecimalList。有没有其他的工作比循环?

任何帮助表示赞赏。谢谢。

+2

最后,任何解决方案都会包含一个循环。 –

+1

没有其他解决方案,但循环有什么问题? – onon15

+1

为什么很多人问这个问题?首先,为什么循环如此糟糕?其次,为什么你认为有可能做这样的事情而没有循环(在某种程度上)? – jahroy

回答

8

那么东西的得到循环 - 直到Java 8带有lambda表达式以使它更容易表达转换,没有通用的转换方式。很明显,你可以编写一个方法来获取类名,并始终通过反射将传入列表的每个元素作为参数传递给目标类的构造函数,但在其他各种情况下都会失败。

鉴于环多么短暂,我肯定会做到这一点:

List<BigDecimal> bigDecimalList = new LinkedList<BigDecimal>(); 
for (String value : stringList) { 
    bigDecimalList.add(new BigDecimal(value)); 
} 

真的需要避免这4行代码?

5

一些水平 - 无论是在外部库,一个较低的水平库,或在你的代码 - 你必须遍历结构和创建你的其他名单的新BigDecimal对象。

既然Java 8已经实现了,那么它可以被表达得相当简洁。此代码假定您已经在某处定义了stringList

List<BigDecimal> bigDecimalList = stringList.stream() 
     .map(BigDecimal::new) 
     .collect(Collectors.toList()); 

这需要所有的stringList的内容,将它们映射到对面的BigDecimal构造函数,并把它们收集到一个新的List对象,我们然后分配。

2

使用Google Common的transform。您提供原始列表和转换函数,并执行循环,将转换应用于每个元素。这实际上是懒散地完成的,所以在迭代或获取元素之前,变换不会被应用。

List<String> strings = ... 
List<BigDecimal> numbers = Lists.transform(strings, new Function<String, BigDecimal>() { 
    public BigDecimal apply(String str) { 
    return new BigDecimal(str); 
    } 
}); 

这样做会使您向功能编程更进一步。

2

如果使用Eclipse Collections(前身为GS集合),改变的StringList到MutableList或类似的东西,你可以这样写:

MutableList<String> stringList = FastList.newListWith("123", "456", "789"); 

MutableList<BigDecimal> bigDecimalList = stringList.collect(new Function<String, BigDecimal>() 
{ 
    public BigDecimal valueOf(String eachString) 
    { 
     return new BigDecimal(eachString); 
    } 
}); 

与Java 8个方法引用,这将成为:

MutableList<BigDecimal> bigDecimalList = stringList.collect(BigDecimal::new); 

注:我是Eclipse Collections的提交者。