Java 8ストリームを配列に変換する方法は?


775

Java 8 Streamを配列に変換する最も簡単で短い方法は何ですか?


2
質問がより完全で、何かを試みたことを示したので、ロールバックを元に戻すことをお勧めします。
skiwi 2014

2
@skiwiありがとう!しかし、試行されたコードが質問に実際にさらに情報を追加することはなく、誰も「あなたの試みを見せて」と叫んだ人はいません=)

17
@skiwi:私はいつもdo-my-homework-instead-of-meの質問で大声を出しますが、この特定の質問は追加の混乱なしに私には明確に思えます。整理整頓しましょう。
Honza Zidek 2014

あなたは、パッケージの公式ドキュメントに答えと指導をたくさん見つけることができます。docs.oracle.com/javase/8/docs/api/java/util/stream/...
クリストフRoussy

回答:


1168

最も簡単な方法は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

8
:そして、ここでなぜ、どのようにArrayコンストラクタ参照実際に作業の説明ですstackoverflow.com/questions/29447561/...
jarek.jpa

「Zenexerは正しいです。解決策は次のとおりです:stream.toArray(String [] :: new);」...わかりましたが、メソッド参照は論理的および機能的に同等であるtoArray(sz -> new String[sz])ことを理解する必要があるため、ソリューションが何であるか、または何である必要があるかを本当に言えるかどうかはわかりません。
scottb

3
@scottb sz -> new String[sz]は、コンストラクタ参照とは異なり、新しい関数を作成します。ガベージコレクションのチャーンをどれだけ重視するかによって異なります。
WORMSS 2017

3
@WORMSSありません。それは(静的に!)新しい、private methodを作成します。チャーンは発生せず、両方のバージョンで新しいオブジェクトを作成する必要があります。参照は、ターゲットメソッドを直接指すオブジェクトを作成します。ラムダは、生成されたオブジェクトを指すオブジェクトを作成しますprivate。コンストラクターへの参照は、間接参照がなく、VMの最適化が容易なため、パフォーマンスは向上しますが、チャーンはそれとは関係ありません。
HTNW、2017年

2
@HTNWあなたは正しい、私の謝罪。私がこれを最初に試みたときに解約を引き起こしていた解約を引き起こしていたのは、私のデバッグの試みが無事だったので、これが私のやり方であると私は頭の中でそれを突き刺しました。(それが起こるときそれを憎む)。
WORMSS 2017年

41

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();

15

次の簡単なコードブロックを使用して、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つの方法であり、厳密に他のものと同等です。


6

各値をカンマで区切ったテキストを文字列配列に変換し、すべてのフィールドをトリムします。次に例を示します。

String[] stringArray = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new);

4

ストリームを配列に変換するカスタムコレクターを作成できます。

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

5
Stream.toArray(IntFunction)の代わりにこれを使用するのはなぜですか?
Didier L

Collectors.groupingBy一部の属性を属性値ごとのオブジェクトの配列にマップできるように、2引数に渡すコレクターが必要でした。この答えは私にそれを正確に与えます。また、@ DidierL。
Ole VV

3

このtoArray(IntFunction<A[]> generator)メソッドを使用することは、確かに、ストリームを同じタイプのストリームの配列に変換(正確には、収集)するための非常にエレガントで安全な方法です。

ただし、返された配列のタイプが重要でない場合は、toArray()メソッドを使用する方が簡単短くなります。例えば:

    Stream<Object> args = Stream.of(BigDecimal.ONE, "Two", 3);
    System.out.printf("%s, %s, %s!", args.toArray());

0
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);

int[] arr=   stream.mapToInt(x->x.intValue()).toArray();

0
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


あなたの答えと受け入れられた答えの違いは何ですか?
Long Nguyen

@LongNguyenこれは、スニペットだけでなく、オンライン再生シナリオを含む完全な例です。
Sma Ma


-2

いくつかの方法でそれを行うことができます。すべての方法は技術的に同じですが、Lambdaを使用すると一部のコードが簡略化されます。最初に文字列でリストを初期化し、それを人物と呼びましょう。

List<String> persons = new ArrayList<String>(){{add("a"); add("b"); add("c");}};
Stream<String> stream = persons.stream();

これで、次のいずれかの方法を使用できます。

  1. Lambda Expresiionを使用して、サイズが定義された新しいStringArrayを作成します。

    String [] stringArray = stream.toArray(size-> new String [size]);

  2. メソッド参照を直接使用します。

    String [] stringArray = stream.toArray(String [] :: new);

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