回答:
の操作を使用してT
、タイプのリスト(配列)をタイプのリスト(配列)に変換するヘルパーメソッドを作成できます。U
map
stream
//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
(メソッドリファレンスを参照してください)
List<Integer> intList = strList.stream()
.map(Integer::valueOf)
.collect(Collectors.toList());
承認された回答のヘルパーメソッドは必要ありません。ストリームはラムダで使用するか、通常はメソッド参照を使用して短縮できます。ストリームは機能的な操作を可能にします。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バージョンも参照してください。フォークをクリックして実行すると、ブラウザーで実行できます。
編集:コメントで指摘されているように、これははるかに単純なバージョンです:
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();
これは何をしますか:
Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray()
あなたも使うことができます、
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);
さらに-文字列配列に要素がない場合の制御:
Arrays.stream(from).filter(t -> (t != null)&&!("".equals(t))).map(func).toArray(generator)
Lists.transform()
いる場合は、も使用できます。