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();
我在工作中看到了这个代码片段。我无法正确了解这里发生的事情。我尝试使用调试器获取值,但调试器在这里没有帮助。
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();