2017-04-17 78 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