2017-04-17 24 views
-2

このストリームを使用して、毎回異なる結果をマッピングするために、変数cをストリーム内に再割り当てしようとしています。私はストリームの外でforeachループを使用しようとしましたが、ストリーム内で発生しないので無駄になったことに気付きました。Javaマッピングストリーム変数の再割り当て

私はこれをやろうとしています。

List<Hills> hills = readHills(); 
Set<String> countys = new HashSet<>(); 
    for (Hills s: hills) { 
     countys.add(s.getCounty()); 
     String[] c = new String[0]; 
     c[1] = s.getCounty(); 
     System.out.println("### County: " + c[0]); 
     hills.stream() 
       .filter(Hill -> !Hill.getCounty().equals(c[0])) 
       .map((Hills Hill) -> Hill.getName() + " " + Hill.getHeight()) 
       .forEach(Hill ->{ 
         System.out.println(Hill); 
         c[0] = Hill.getCounty();  // This is what I am trying to do 
         }); 
      } 
+0

配列はゼロインデックスから始まります。 – Omore

+0

あなたのコードはさらに悪くなりました。配列の長さはゼロですが、その後すぐに2番目の配列要素にアクセスしようとしています。とにかく、すべてのアクセスは失敗します。 – Holger

答えて

0

さて、あなたfilterはおそらくall resultsを除外します。それができないなら、出力にjava.lang.ArrayIndexOutOfBoundsException: 1がたくさん表示されます。問題はここにある:あなたが(indexゼロでアクセスして)単一の要素の配列を宣言している

String[] c = new String[1]; 
... some other code 
System.out.println(Hill); 
c[1] = Hill.getCounty(); // you can only access c[0] here 

。あなたはindex 1でアクセスしようとします。存在しない。

コードをc[0] = Hill.getCounty()に変更しても、最後にのを保存していて、forEachを使用しているため(その順序は保証されていません)、リスト内の最後のHillを意味しない場合もあります。例えばparallel stream)。

+0

c [0]を忘れて、それが正しいと仮定して、蒸気に値を再割当てする方法はありませんか? – Aresouman

+0

@Aresoumanあなたは各ステップで変数を再割り当てするでしょう - はい、ストリームが消費されたら。ストリームにあった最後の値だけが配列に格納されます。それとも別のことを意味するの? – Eugene

+0

すべてのストリーム要素は 'Hill.getName()+" "+ Hill.getHeight()'、つまり 'String'にマップされているので、これらのオブジェクトに対して' .getCounty() 'を呼び出すことはできませんとにかく;変数「Hill」の名前を付けても助けにならない... – Holger