Java 8 字符串流连接:流已被操作或关闭

Java 8 字符串流连接:流已被操作或关闭,java-8,Java 8,使用java8将一个对象的某个字段值与一个“\”连接起来。代码中的最后一行抛出一个“流已被操作或关闭” 流字段=。。。 流排除=。。。 Stream-stringStream=fields.filter(f->exclusions.anyMatch(e->e.equals(f.getName())) .map(f->{ f、 setAccessible(true); 对象值=空; 试一试{ 值=f.get(obj); }捕获(非法访问例外e){ e、 printStackTrace(); } 返

使用java8将一个对象的某个字段值与一个“\”连接起来。代码中的最后一行抛出一个“
流已被操作或关闭”

流字段=。。。
流排除=。。。
Stream-stringStream=fields.filter(f->exclusions.anyMatch(e->e.equals(f.getName()))
.map(f->{
f、 setAccessible(true);
对象值=空;
试一试{
值=f.get(obj);
}捕获(非法访问例外e){
e、 printStackTrace();
}
返回值;
})
.filter(v->v!=null)
.map(对象::toString);
字符串后缀=stringStream.collect(收集器.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(""));
List List=new ArrayList();
list.stream().filter(项目->项目!=null).map(项目->{
字符串值=null;
返回值;
}).filter(项目->项目!=null).map(项目->{
字符串值=null;
返回值;
}).collect(收集器。连接(“”);

没有这样的例外。

第一个
过滤器调用了多少次?不止一次,对吗?您在第一次调用filter时使用的排除项通过anyMatch使用;因此,当你第二次尝试使用它时,你会得到异常

解决此问题的方法是在每个过滤器操作上进行流式处理:

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

您正在尝试为
字段的每个元素重新使用
排除
流。流不能被重用。将您的排除项放入
集合
并按
f->进行筛选!ExclutionsSet.contains(f.getName())
@Misha为什么要重用
Exclutions
流?我想在第一个过滤器中使用一次。@Misha@Eugene OK。我理解。在另一个用法中,我有
过滤器(f->!Arrays.stream(exclusions).anyMatch(e->e.equals(f.getName()))
,因此相同的数组被转换为每个项目的流,因此这是可以的。@Tiina我做了一个回答。。。
filter(f -> sourceOfExclusions.stream().anyMatch...