字符串流加入:流已经被操作或关闭

时间:2017-04-26 02:21:05

标签: java-8

使用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(""));

没有这样的例外。

1 个答案:

答案 0 :(得分:2)

第一个filter被叫多少次?再过一次吧?您在第一次调用过滤器时使用的排除项通过anyMatch消耗;因此,第二次尝试使用它 - 你得到了例外。

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

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