2017-04-17 114 views
-2

使用此流,我試圖重新分配變量c的流內部,以每次繪製不同的結果。我試圖在流之外使用foreach循環,但是我意識到它是徒勞的,因爲它不會在流中發生。爪哇 - 映射流變量再分配

我已作了評論,我試圖做到這一點。

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

你已經使你的代碼變得更糟,現在你的數組長度爲零,但你仍然試圖訪問第二個數組元素,之後。儘管現在,每個訪問都會失敗。 – Holger

回答

0

那麼你的filter最有可能會過濾掉all results。如果不這樣做,那麼在輸出中會看到很多java.lang.ArrayIndexOutOfBoundsException: 1。該問題是在這裏:

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

您(由index零訪問它)聲明一個單個元件的陣列;但您嘗試通過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