4

Java で String のリストを 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。を反復処理し、 usingstringListに追加できることはわかっています。ループ以外の回避策はありますか???bigDecimalListnew BigDecimal(string)

どんな助けでも大歓迎です。ありがとう。

4

4 に答える 4

8

何かループする必要があります。変換を簡単に表現できるラムダ式が Java 8 に組み込まれるまでは、変換を行う汎用的な方法はありません。明らかに、クラス名を取り、着信リストの各要素を常にリフレクションを介してターゲット クラスのコンストラクターに引数として渡すメソッドを作成できますが、それは他のあらゆる種類の状況で失敗します。

ループがどれほど短いかを考えると、私は間違いなくそうします:

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 コレクション(以前の 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 コレクションのコミッターです。

于 2013-02-05T22:19:15.580 に答える