たぶんこれは非常に簡単ですが、私は実際にJava 8機能の初心者であり、これを達成する方法がわかりません。次のテキストを含むこの単純な行があります。
「キー、名前」
そして、その行を文字列配列に変換し、各値をコンマ(、)で区切りますが、最終的な配列を返す前にすべてのフィールドをトリミングしたいので、次のようにしました:
Arrays.stream(line.split(",")).map(String::trim).toArray();
ただし、これはString []配列ではなくObject []配列を返します。さらに調べると、コンテンツは実際にはStringインスタンスであるが、配列自体はObject要素であることが確認できます。これを説明しましょう。これは、デバッガーが返されたオブジェクトについて言っていることです。
Object[]:
0 = (String) "Key"
1 = (String) "Name"
私が知る限り、問題はマップ呼び出しの戻り値のタイプにありますが、String []配列を返すようにするにはどうすればよいですか?
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-目的の型と指定された長さの新しい配列を生成する関数
String[]::new
は、String[]
がString型の実際のnew
メソッドを呼び出す関数であるのと同様に、String::trim
型に対してtrim
「疑似メソッド」を呼び出す関数です。 toArrayによってString::new
関数に渡される値は、.toArray()メソッド呼び出しの右側のコレクションのサイズです。
String[]::new
をn->new String[n]
で置き換えた場合は、String::trim
をあまりクールでないs->s.trim()
で置き換えることができるのと同じように、構文がより快適になります。