Java 8 个流媒体 API 与地图一起使用

Java 8 streaming API using with Map

我在工作中看到了这个代码片段。我无法正确了解这里发生的事情。我尝试使用调试器获取值,但调试器在这里没有帮助。

public static void process (ErrorCat exc, String toFind) {
          Map<String, Function<Error, Error>>  translate = new HashMap<>(); 
            translate.put("foo", new classThatimplementsFunction());
             translate.put("bar", new classThatimplementsFunction())
            List<Error> Errors = Lists.newArrayList();
            List<Error> retErrors = Lists.newArrayList();
            retErrors.addAll(exc.getErrors());
            translate.keySet()
                    .stream()
                    .filter(k->toFind.contains(k))
                    .forEach(key->exc.getErrors() // from here I dont follow
                            .stream()
                            .forEach(e->{retErrors.remove(e); Errors.add(translate.get(key).apply(e));}));

我在上面评论了我开始难以理解的地方。 第二个 ForEach 为每个被过滤的 key 执行。如果是这样,那么 retErrors.remove(e); 在 key 的第二次迭代期间将无效(因为 retErrors 在第一次迭代后将为空)

这看起来像是有人让 IDE 自动将命令式代码转换为流。

我认为 retErrors.remove(e) 如果有翻译者匹配 toFind,可以将 retErrors 留空。这是我对代码原意的最佳猜测:

List<Error> errors = translate.keySet().stream()
                            .filter(toFind::contains)
                            .map(translate::get)
                            .flatMap(translator -> exc.getErrors().stream().map(translator))
                            .collect(toList());

List<Error> retErrors = errors.isEmpty() 
                            ? new ArrayList<>(exc.getErrors()) 
                            : Collections.emptyList();