2017-04-26 59 views
1

使用java8將對象某個字段值與「_」連接起來。代碼中的最後一行顯示「stream has already been operated upon or closed」。字符串流加入:流已經被操作或關閉

Stream<Field> fields = ... 
Stream<String> exclusions = ... 
Stream<String> stringStream = fields.filter(f -> exclusions.anyMatch(e -> e.equals(f.getName()))) 
     .map(f -> { 
      f.setAccessible(true); 
      Object value = null; 
      try { 
       value = f.get(obj); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
      return value; 
     }) 
     .filter(v -> v != null) 
     .map(Object::toString); 
String suffix = stringStream.collect(Collectors.joining("_")); 

編輯:我有試過這樣:

List<Foo> list = new ArrayList<>(); 
list.stream().filter(item -> item != null).map(item -> { 
    String value = null; 
    return value; 
}).filter(item -> item != null).map(item -> { 
    String value = null; 
    return value; 
}).collect(Collectors.joining("")); 

並沒有這樣的例外。

+4

您正在嘗試重用'exclusions'流爲fields'的'每一個元素。流不能被重用。把你的排除項放入一個'Set'並用'f - >過濾! exclusionsSet.contains(f.getName())' – Misha

+0

@Misha爲什麼'排除'流被重用?我認爲它在第一個過濾器中使用過一次。 – Tiina

+0

@Misha @Eugene OK。我明白。在另一個用法中,我有'過濾(f - >!Arrays.stream(排除).anyMatch(e - > e.equals(f.getName())))',因此相同的數組變成每個項目的流因此沒關係。 – Tiina

回答

2

調用第一個filter多少次?多一次正確?您在首次調用過濾器時使用的排除是通過anyMatch消耗的;因此你第二次嘗試使用它 - 你會得到例外。

解決這個問題的辦法,是對每一個過濾器操作流:

filter(f -> sourceOfExclusions.stream().anyMatch...