web-dev-qa-db-ja.com

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

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

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

通常のJavaでは、それは同じくらい簡単でしょう

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

しかし、整数の配列に変換される文字列の配列を考えると、どのようにしてラムダで同じことを達成するのですか。

102
Reddy
List<Integer> intList = strList.stream()
                               .map(Integer::valueOf)
                               .collect(Collectors.toList());
112
ZehnVon12

承認された回答からのヘルパーメソッドは必要ありません。 Streams はラムダと一緒に使用することも、通常 Method References を使用して短縮することもできます。ストリームは機能的な操作を可能にします。 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);

もちろんもっとたくさんのバリエーションが可能です。

これらの例の理想的なバージョン もご覧ください。フォークをクリックしてからブラウザで実行することができます。

25
Stan Kurdziel

編集:コメントで指摘されているように、これははるかに単純なバージョンです: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()は配列をListに変換します
  2. .streamはそれをStreamに変換します(マップを実行するのに必要です)
  3. .map(Integer :: parseInt)は、ストリーム内のすべての要素をIntegersに変換します。
  4. .mapToInt(i-> i)はすべての整数を整数に変換します(整数だけが必要な場合はこれを行う必要はありません)。
  5. .toArray()はストリームを配列に変換します。
7
Colander

リストの場合:

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

配列の場合

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

また、使うことができます、

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);
2
user2182920

私は前の答えではそれを見つけられませんでした、それで、Java 8とストリームで:

String[]Integer[]に変換します。

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