2015-05-20 3 views
-1

Я вижу этот фрагмент кода в своей работе. Я не могу получить правильное представление о том, что здесь происходит. Я пытался использовать отладчик для получения значений, но отладчик здесь не помогает.Java 8 потоковый API с использованием карты

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); во время второй итерации ключа не будет иметь эффекта (поскольку retErrors будет пустым после первой итерации)

+0

Не могли бы вы попросить человека, написавшего этот фрагмент кода? У вас будет, конечно, лучшее объяснение. –

+0

Я хочу, чтобы этот человек продолжал работать ... –

+2

О, это довольно неудачно, поэтому .. Вот почему вы должны прокомментировать свой код. –

ответ

2

Это похоже на то, что кто-то позволил IDE автоматически преобразовать императивный код в потоки.

Я думаю, retErrors.remove(e) есть, чтобы оставить retErrors пустым, если у переводчика toFind. Это мое лучшее предположение о первоначальном намерении кода:

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(); 
Смежные вопросы