在java中将字符串列表转换为BigDecimal列表

Posted

技术标签:

【中文标题】在java中将字符串列表转换为BigDecimal列表【英文标题】:Convert List of String to List of BigDecimal in java 【发布时间】:2013-01-20 00:56:09 【问题描述】:

我在将 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 并可以使用new BigDecimal(string) 添加到bigDecimalList。除了循环还有其他工作吗???

感谢任何帮助。谢谢。

【问题讨论】:

最后,任何解决方案都会包含一个循环。 没有其他解决方案,但是循环有什么问题? 为什么这么多人问这个问题?首先,为什么循环如此糟糕?其次,为什么你认为可以在不循环的情况下(在某种程度上)做这样的事情? 当然,人们总是可以用一种实用方法把循环收起来。 【参考方案1】:

有些东西必须循环——直到 Java 8 提供了 lambda 表达式以更容易地表达转换,没有通用的方法来进行转换。显然,您可以编写一个方法,该方法采用类名并始终通过反射将传入列表的每个元素作为参数传递给目标类的构造函数,但这在其他各种情况下都会失败。

鉴于循环有多短,我肯定会这样做:

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

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

【讨论】:

【参考方案2】:

some 级别 - 无论是在外部库、较低级别的库还是在您的代码中 - 您必须遍历结构并在您的其他列表中创建新的 BigDecimal 对象.

现在 Java 8 已经有效地退出了,它可以如此简洁地表达出来。此代码假定您已经在某处定义了stringList

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

这会获取stringList 的所有内容,将它们映射到BigDecimal 的构造函数,并将它们收集到一个新的List 对象中,然后我们将其分配。

【讨论】:

【参考方案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);
  
);

这样做会让你更接近函数式编程。

【讨论】:

【参考方案4】:

如果你使用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 的提交者。

【讨论】:

以上是关于在java中将字符串列表转换为BigDecimal列表的主要内容,如果未能解决你的问题,请参考以下文章

java中的BigDecimal和String的相互转换

将 double 转换为 BigDecimal 并设置 BigDecimal 精度

在java中将整数列表转换为整数数组[重复]

java中的BigDecimal和String的相互转换

如何在Java中将非常大的十进制数转换为二进制数

Talend 从字符串转换为 bigdecimal