我在将一个String列表转换为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
并可以使用bigDecimalList
添加到new BigDecimal(string)
。还有其他工作而不是循环???
感谢任何帮助。感谢。
答案 0 :(得分:8)
某些东西必须循环 - 直到Java 8附带lambda表达式以便更容易表达转换,没有通用的方法来进行转换。显然你可以编写一个方法来获取类名,并且总是通过反射将传入列表的每个元素作为参数传递给目标类的构造函数,但是在所有其他情况下都会失败。
鉴于循环有多短,我肯定会这样做:
List<BigDecimal> bigDecimalList = new LinkedList<BigDecimal>();
for (String value : stringList) {
bigDecimalList.add(new BigDecimal(value));
}
你真的需要避免这4行代码吗?
答案 1 :(得分:5)
在某些级别 - 无论是在外部库,低级库还是在代码中 - 您都必须遍历结构并在您的对象中创建新的BigDecimal
对象其他清单。
现在Java 8已经有效地出现了,因此可以相当简洁地表达它。此代码假定您已经在某处定义了stringList
。
List<BigDecimal> bigDecimalList = stringList.stream()
.map(BigDecimal::new)
.collect(Collectors.toList());
这将获取stringList
的所有内容,将它们映射到BigDecimal
的构造函数,并将它们收集到一个新的List
对象中,然后我们将其分配。
答案 2 :(得分:3)
使用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);
}
});
这样做会让你更接近功能编程。
答案 3 :(得分:2)
如果你使用Eclipse Collections(以前的GS Collections)并将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的提交者。