2013-02-05 180 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的提交者。