2016-12-01 5 views
29

これは非常にシンプルですが、実際にはJava 8の機能のnoobであり、これを実現する方法がわかりません。 、JavaストリームtoArray()は特定のタイプの配列に変換します

「キー、名前」

と私はカンマ(、)で各値を分離し、文字列の配列にその行を変換したい:私は、次のテキストが含まれています。このシンプルなラインを持っていますしかし、私はまた、最終的な配列を返す前に、すべてのフィールドをトリミングしたいので、私は次のようでした:

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

しかし、これは、Object []配列ではなく、String []型の配列を返します。さらに検査すると、内容が実際にStringインスタンスであることが確認できますが、配列自体はObject要素であることが確認できます。

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

は、私の知る限り、問題は、マップの呼び出しの戻り値の型であるが、どのように私はそれを返すことができます。これは、デバッガが返されたオブジェクトの言うことで、私はこのことを説明してみましょうString [] array?

答えて

51

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

のためのラムダ式です。

docs

から生成関数は、所望の配列のサイズの整数をとり、所望のサイズのアレイを生成します。これは簡潔配列コンストラクタ参照して表すことができる。

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

型パラメータ:

A - 得られた配列

パラメータの要素型:

ジェネレータ - 新しいarを生成する関数所望の種類と提供長

+0

String::trimを置き換えることができます同じように構文でより快適かもしれませんn->new String[n]String[]::newを交換した場合、あなたは 'のString [] :: new'メソッド参照が何をしているか説明していただけますどのようにして、通常のラムダ式を使って同じことをすることができますか? (私はint型の "値"を生成することがわかりますが、それは私には意味がありません)。 – arielnmz

+2

もちろん、 "value"の代わりにパラメータ変数 "size"を指定するほうが意味が分かりやすいでしょう。 – Holger

+3

ところで、デリミタの空白部分を作ると 'trim'ステップは廃止されます。 'line.split(" \\ s *、\\ s * ")'のようになりますので、最初は結果文字列に含まれていません。次に、ストリーム操作はまったく必要ありません。 'String [] result = line.split(" \\ s *、\\ s * ");'。あるいは 'String [] result = line.split("、 "); Arrays.asList(結果).replaceAll(文字列::トリム); 'あなたはすべてのタスクのためにストリームを必要としません... – Holger

2

String[]::newの光線は、String型の実trimメソッドを呼び出す関数であるだけString::trimようString[]タイプにnew「擬似法」を呼び出す関数です。 toArrayによってString::new関数に渡される値は、.toArray()メソッド呼び出しの右側にあるコレクションのサイズです。

あなたは、あなたがより少ない涼しいs->s.trim()

関連する問題