使用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(""));
没有这样的例外。
答案 0 :(得分:2)
第一个filter
被叫多少次?再过一次吧?您在第一次调用过滤器时使用的排除项通过anyMatch消耗;因此,第二次尝试使用它 - 你得到了例外。
解决问题的方法是对每个过滤器操作进行流式处理:
filter(f -> sourceOfExclusions.stream().anyMatch...