2017-04-26 1 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

. 스트림을 다시 사용할 수 없습니다. 당신의 예외를'Set'에 넣고'f ->! exclusionsSet.contains (f.getName())' – Misha

+0

@Misha'제외 '스트림이 재사용되는 이유는 무엇입니까? 나는 이것이 첫 번째 필터에 사용 된 것으로 생각합니다. – Tiina

+0

@Misha @Eugene 확인. 이해 했어. 다른 사용법에서는'filter (f ->! Arrays.stream (excluions) .anyMatch (e -> e.equals (f.getName())))')를 사용하여 동일한 배열을 모든 항목에 대한 스트림으로 변환하고 그러므로 괜찮습니다. – Tiina

답변

2

처음으로 몇 번이나 filter이 호출됩니까? 그때 한 번 더 맞습니까? 필터 호출의 첫 번째 호출에서 사용하는 제외 항목은 anyMatch를 통해 소비됩니다. 따라서 두 번째 사용하려고하면 예외가 발생합니다.

를 해결하는 방법, 모든 단일 필터 작업에 스트리밍하는 것입니다 : 당신은 fields``의 모든 요소에 대해`exclusions` 스트림을 재사용하려고

filter(f -> sourceOfExclusions.stream().anyMatch... 
관련 문제