2017-04-26 24 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...