4

我在将 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>();

现在我想转换stringListbigDecimalList. 我知道我们可以遍历stringList并且可以添加到bigDecimalListusing new BigDecimal(string)。除了循环还有其他工作吗???

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

4

4 回答 4

8

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

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

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

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

于 2013-02-05T06:57:09.643 回答
6

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

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

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

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

于 2013-02-05T06:56:17.803 回答
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);
  }
});

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

于 2013-02-05T07:21:05.530 回答
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 的提交者。

于 2013-02-05T22:19:15.580 回答