有没有一种方法可以将一个 Big Decimals 列表强制转换为 Long 值的列表?

4

如果我有一个 List 包含一些 BigDecimal 对象,是否可以将整个列表强制转换为 List 包含一些 Long 值,而无需对每个 BigDecimal 对象进行迭代?


3
如果您不想遍历整个列表,那么您打算如何获取整个列表中的值?此外,强制转换可能无法正常工作,但有一种方法可以从这些对象中获取长整型值。 - Makoto
1
即使您使用自Java 8以来可用的Java Stream API,仍需要遍历集合中的元素。 - Luiggi Mendoza
@Makoto 我稍后会迭代它,但我不想做两次。我对找到解决方案并不太乐观,我想我将不得不在每个对象上执行longValue()。 - john.p.doe
1
你可以返回一个 LongStream ,因此如果调用者只在流的前10个元素上进行迭代,那么只有前10个元素将被转换为长整型值:Stream是惰性的。 - JB Nizet
2个回答

6

你需要以某种方式进行迭代。如果你想要“隐藏”迭代,你可以使用流(stream):

List<Long> longs = bigs.stream().map(BigDecimal::longValue).collect(Collectors.toList());

但仍将在后台进行一次迭代。

您提到不想迭代两次- 您可以将长整数流保存供以后使用:

LongStream longs = bigs.stream().mapToLong(BigDecimal::longValue);

在收集结果之前,对该流执行其他操作。


3
将流保存以便稍后使用只能起作用一次:一旦流被使用,就不能再次重复使用。 - JB Nizet
@assylias 这看起来像是我可以处理的东西。非常感谢。 - john.p.doe
@JBNizet 有一种方法可以通过将它们放入生成器函数中来“重用”流。 - Flown

0

如果没有Java 8的流,你可以使用Guava transform:

private List<Long> convertToLongList(List<BigDecimal> bigDecimalList) {
    return Lists.transform(bigDecimalList, new Function<BigDecimal, Long>() {
        public Long apply(BigDecimal bigDecimal) {
            return bigDecimal.longValue();
        }
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接