配列/文字列のリストを配列/整数のリストに変換するラムダ式


111

Java 8には強力なラムダ式が付属しているため、

文字列のリスト/配列を整数、浮動小数点数、倍精度数などの配列/リストに変換する関数を書きたいのですが。

通常のJavaでは、次のように簡単です。

for(String str : strList){
   intList.add(Integer.valueOf(str));
}

しかし、整数の配列に変換される文字列の配列が与えられた場合、どうやってラムダで同じことを達成できますか?

回答:


128

の操作を使用してT、タイプのリスト(配列)をタイプのリスト(配列)に変換するヘルパーメソッドを作成できます。Umapstream

//for lists
public static <T, U> List<U> convertList(List<T> from, Function<T, U> func) {
    return from.stream().map(func).collect(Collectors.toList());
}

//for arrays
public static <T, U> U[] convertArray(T[] from, 
                                      Function<T, U> func, 
                                      IntFunction<U[]> generator) {
    return Arrays.stream(from).map(func).toArray(generator);
}

次のように使用します。

//for lists
List<String> stringList = Arrays.asList("1","2","3");
List<Integer> integerList = convertList(stringList, s -> Integer.parseInt(s));

//for arrays
String[] stringArr = {"1","2","3"};
Double[] doubleArr = convertArray(stringArr, Double::parseDouble, Double[]::new);


s -> Integer.parseInt(s)に置き換える ことができることに注意してください Integer::parseIntメソッドリファレンスを参照してください


5
Guavaを使用してLists.transform()いる場合は、も使用できます。
Alexandros

非常に良い例です。関数は、コードをより多用途で強力にします。ありがとう!!!
MarceloRebouças19年

127
List<Integer> intList = strList.stream()
                               .map(Integer::valueOf)
                               .collect(Collectors.toList());

5
これについて少し説明してもらえますか?
Unheilig 2014年

1
これは、文字列のリストをストリームに変換してから、リストのすべての要素をIntegerにマッピング/変換してから、リストに収集します。
hemanto 2017

5
ラムダのポイント(元の質問はラムダ式を要求する)が新しい関数の定義を回避することなので、これは受け入れられる答えになるはずです。その上、この回答は既存のInteger :: valueOf関数をエレガントに使用しています
Jonathan Benn

31

承認された回答のヘルパーメソッドは必要ありません。ストリームはラムダで使用するか、通常はメソッド参照を使用して短縮できます。ストリームは機能的な操作を可能にします。map()要素を変換しcollect(...)たりtoArray()、配列やコレクションにストリームバックを包みます。

Venkat Subramaniamの講演(ビデオ)は私よりもよく説明しています。

1変換List<String>しますList<Integer>

List<String> l1 = Arrays.asList("1", "2", "3");
List<Integer> r1 = l1.stream().map(Integer::parseInt).collect(Collectors.toList());

// the longer full lambda version:
List<Integer> r1 = l1.stream().map(s -> Integer.parseInt(s)).collect(Collectors.toList());

2変換List<String>しますint[]

int[] r2 = l1.stream().mapToInt(Integer::parseInt).toArray();

3変換String[]しますList<Integer>

String[] a1 = {"4", "5", "6"};
List<Integer> r3 = Stream.of(a1).map(Integer::parseInt).collect(Collectors.toList());

4変換String[]しますint[]

int[] r4 = Stream.of(a1).mapToInt(Integer::parseInt).toArray();

5変換String[]しますList<Double>

List<Double> r5 = Stream.of(a1).map(Double::parseDouble).collect(Collectors.toList());

6(ボーナス)を変換int[]しますString[]

int[] a2 = {7, 8, 9};
String[] r6 = Arrays.stream(a2).mapToObj(Integer::toString).toArray(String[]::new);

もちろん、さらに多くのバリエーションが可能です。

これらの例のIdeoneバージョンも参照してください。フォークをクリックして実行すると、ブラウザーで実行できます。


7

編集:コメントで指摘されているように、これははるかに単純なバージョンです: Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray() この方法では、リストとの間の変換全体をスキップできます。


別の1行のソリューションを見つけましたが、それでもかなり遅いです(forサイクルの約100倍の時間がかかります-6000 0のアレイでテスト)

String[] stringArray = ...
int[] out= Arrays.asList(stringArray).stream().map(Integer::parseInt).mapToInt(i->i).toArray();

これは何をしますか:

  1. Arrays.asList()は配列をリストに変換します
  2. .streamはストリームに変換します(マップを実行するために必要)
  3. .map(Integer :: parseInt)は、ストリーム内のすべての要素を整数に変換します
  4. .mapToInt(i-> i)は、すべての整数を整数に変換します(整数のみが必要な場合は、これを行う必要はありません)。
  5. .toArray()は、ストリームを元の配列に変換します

13
:あなたは1と4のステップを必要としないArrays.stream(stringArray).mapToInt(Integer::parseInt).toArray()
xehpuk

3

リストの場合:

List<Integer> intList 
 = stringList.stream().map(Integer::valueOf).collect(Collectors.toList());

アレイの場合:

int[] intArray = Arrays.stream(stringArray).mapToInt(Integer::valueOf).toArray();

2

あなたも使うことができます、

List<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("3");

    Integer[] array = list.stream()
        .map( v -> Integer.valueOf(v))
        .toArray(Integer[]::new);

0

以前の回答ではそれが見つからなかったので、Java 8とストリームを使用します。

変換String[]するにはInteger[]

Arrays.stream(stringArray).map(Integer::valueOf).toArray(Integer[]::new)


-1

文字列を整数に変換するためにLambda操作でmaptoInt()を使用しました

int[] arr = Arrays.stream(stringArray).mapToInt(item -> Integer.parseInt(item)).toArray();

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.