Java 8 Stream
を配列に変換する最も簡単で短い方法は何ですか?
Java 8 Stream
を配列に変換する最も簡単で短い方法は何ですか?
回答:
最も簡単な方法はtoArray(IntFunction<A[]> generator)
、配列コンストラクター参照でメソッドを使用することです。これは、メソッドのAPIドキュメントで推奨されています。
String[] stringArray = stringStream.toArray(String[]::new);
これは、整数(サイズ)を引数として取り、String[]
正確に(のオーバーロードの1つ)new String[]
が行うを返すメソッドを見つけます。
自分で書くこともできますIntFunction
:
Stream<String> stringStream = ...;
String[] stringArray = stringStream.toArray(size -> new String[size]);
の目的は、IntFunction<A[]> generator
配列のサイズである整数を新しい配列に変換することです。
コード例:
Stream<String> stringStream = Stream.of("a", "b", "c");
String[] stringArray = stringStream.toArray(size -> new String[size]);
Arrays.stream(stringArray).forEach(System.out::println);
プリント:
a
b
c
toArray(sz -> new String[sz])
ことを理解する必要があるため、ソリューションが何であるか、または何である必要があるかを本当に言えるかどうかはわかりません。
sz -> new String[sz]
は、コンストラクタ参照とは異なり、新しい関数を作成します。ガベージコレクションのチャーンをどれだけ重視するかによって異なります。
private
methodを作成します。チャーンは発生せず、両方のバージョンで新しいオブジェクトを作成する必要があります。参照は、ターゲットメソッドを直接指すオブジェクトを作成します。ラムダは、生成されたオブジェクトを指すオブジェクトを作成しますprivate
。コンストラクターへの参照は、間接参照がなく、VMの最適化が容易なため、パフォーマンスは向上しますが、チャーンはそれとは関係ありません。
1から10までの値を持つintの配列をStreamから取得したい場合は、IntStreamを自由に使用できます。
ここでは、Stream.ofメソッドを使用してStreamを作成し、mapToIntを使用してStreamをIntStreamに変換します。次に、IntStreamのtoArrayメソッドを呼び出すことができます。
Stream<Integer> stream = Stream.of(1,2,3,4,5,6,7,8,9,10);
//or use this to create our stream
//Stream<Integer> stream = IntStream.rangeClosed(1, 10).boxed();
int[] array = stream.mapToInt(x -> x).toArray();
これは同じことですが、ストリームなしで、IntStreamのみを使用しています。
int[]array2 = IntStream.rangeClosed(1, 10).toArray();
次の簡単なコードブロックを使用して、Java 8ストリームを配列に変換できます。
String[] myNewArray3 = myNewStream.toArray(String[]::new);
しかし、さらに説明しましょう。最初に、3つの値で満たされた文字列のリストを作成しましょう。
String[] stringList = {"Bachiri","Taoufiq","Abderrahman"};
指定された配列からストリームを作成します。
Stream<String> stringStream = Arrays.stream(stringList);
これで、このストリームでいくつかの操作を実行できますEx:
Stream<String> myNewStream = stringStream.map(s -> s.toUpperCase());
そして最後に、これらのメソッドを使用してJava 8配列に変換します。
1-Classicメソッド(機能インターフェース)
IntFunction<String[]> intFunction = new IntFunction<String[]>() {
@Override
public String[] apply(int value) {
return new String[value];
}
};
String[] myNewArray = myNewStream.toArray(intFunction);
2-ラムダ式
String[] myNewArray2 = myNewStream.toArray(value -> new String[value]);
3-メソッドリファレンス
String[] myNewArray3 = myNewStream.toArray(String[]::new);
メソッド参照説明:
これは、ラムダ式を記述するもう1つの方法であり、厳密に他のものと同等です。
各値をカンマで区切ったテキストを文字列配列に変換し、すべてのフィールドをトリムします。次に例を示します。
String[] stringArray = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new);
ストリームを配列に変換するカスタムコレクターを作成できます。
public static <T> Collector<T, ?, T[]> toArray( IntFunction<T[]> converter )
{
return Collectors.collectingAndThen(
Collectors.toList(),
list ->list.toArray( converter.apply( list.size() ) ) );
}
そしてクイック使用
List<String> input = Arrays.asList( ..... );
String[] result = input.stream().
.collect( CustomCollectors.**toArray**( String[]::new ) );
Collectors.groupingBy
一部の属性を属性値ごとのオブジェクトの配列にマップできるように、2引数に渡すコレクターが必要でした。この答えは私にそれを正確に与えます。また、@ DidierL。
import java.util.List;
import java.util.stream.Stream;
class Main {
public static void main(String[] args) {
// Create a stream of strings from list of strings
Stream<String> myStreamOfStrings = List.of("lala", "foo", "bar").stream();
// Convert stream to array by using toArray method
String[] myArrayOfStrings = myStreamOfStrings.toArray(String[]::new);
// Print results
for (String string : myArrayOfStrings) {
System.out.println(string);
}
}
}
オンラインで試してみてください:https : //repl.it/@SmaMa/Stream-to-array
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
Integer[] integers = stream.toArray(it->new Integer[it]);
いくつかの方法でそれを行うことができます。すべての方法は技術的に同じですが、Lambdaを使用すると一部のコードが簡略化されます。最初に文字列でリストを初期化し、それを人物と呼びましょう。
List<String> persons = new ArrayList<String>(){{add("a"); add("b"); add("c");}};
Stream<String> stream = persons.stream();
これで、次のいずれかの方法を使用できます。
Lambda Expresiionを使用して、サイズが定義された新しいStringArrayを作成します。
String [] stringArray = stream.toArray(size-> new String [size]);
メソッド参照を直接使用します。
String [] stringArray = stream.toArray(String [] :: new);