【问题标题】:Java 8 streaming API using with Map使用 Map 的 Java 8 流式 API
【发布时间】:2015-05-20 18:36:13
【问题描述】:

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

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));}));

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

【问题讨论】:

  • 你不能问问写这段代码的人吗?你肯定会有更好的解释
  • 我希望那个人继续工作......
  • 哦,那太不幸了。这就是为什么你应该评论你的代码。

标签: lambda functional-programming java-8 java-stream


【解决方案1】:

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

如果有任何翻译匹配toFind,我认为retErrors.remove(e) 可以将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();

【讨论】:

    猜你喜欢
    • 2015-10-07
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    • 2017-02-12
    • 2018-02-15
    • 2016-09-21
    • 2019-11-24
    • 1970-01-01
    相关资源
    最近更新 更多