web-dev-qa-db-ja.com

Java stream toArray()特定のタイプの配列に変換します

たぶんこれは非常に簡単ですが、私は実際にJava 8機能の初心者であり、これを達成する方法がわかりません。次のテキストを含むこの単純な行があります。

「キー、名前」

そして、その行を文字列配列に変換し、各値をコンマ(、)で区切りますが、最終的な配列を返す前にすべてのフィールドをトリミングしたいので、次のようにしました:

Arrays.stream(line.split(",")).map(String::trim).toArray();

ただし、これはString []配列ではなくObject []配列を返します。さらに調べると、コンテンツは実際にはStringインスタンスであるが、配列自体はObject要素であることが確認できます。これを説明しましょう。これは、デバッガーが返されたオブジェクトについて言っていることです。

Object[]:
    0 = (String) "Key"
    1 = (String) "Name"

私が知る限り、問題はマップ呼び出しの戻り値のタイプにありますが、String []配列を返すようにするにはどうすればよいですか?

58
arielnmz

toArray(size -> new String[size])またはtoArray(String[]::new)を使用します。

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

これは実際にはのラムダ式です

.toArray(new IntFunction<String[]>() {
        @Override
        public String[] apply(int size) {
            return new String[size];
        }
    });

配列を同じサイズのString配列に変換するよう指示しています。

docs から

ジェネレーター関数は、目的の配列のサイズである整数を受け取り、目的のサイズの配列を生成します。これは、配列コンストラクター参照を使用して簡潔に表現できます。

 Person[] men = people.stream()
                      .filter(p -> p.getGender() == MALE)
                      .toArray(Person[]::new);

型パラメーター:

A-結果の配列の要素タイプ

パラメーター:

generator-目的の型と指定された長さの新しい配列を生成する関数

100
Mritunjay

String[]::newは、String[]がString型の実際のnewメソッドを呼び出す関数であるのと同様に、String::trim型に対してtrim「疑似メソッド」を呼び出す関数です。 toArrayによってString::new関数に渡される値は、.toArray()メソッド呼び出しの右側のコレクションのサイズです。

String[]::newn->new String[n]で置き換えた場合は、String::trimをあまりクールでないs->s.trim()で置き換えることができるのと同じように、構文がより快適になります。

4
Paul Buis