Groovy поток дает MissingMethodException для .peek и .map - PullRequest
0 голосов
/ 22 мая 2019

У меня есть отличный код, который использует потоки,

List<MolportEntryVerification> verificationList = molportEntries.stream()
          .peek{if(i++%50 == 0){println(df.format(i/count))}}
          .map({entry -> verifier.verifyEntry(entry, new Standardizer(molportConfig),  new Standardizer(bciConfig))})
          .collect(Collectors.toList())

дают начало:

Пойман: groovy.lang.MissingMethodException: Нет подписи метода: java.util.stream.ReferencePipeline $ Head.peek () применим для типов аргументов: (MolportFileVerification $ _run_closure1) значения: [MolportFileVerification $ _run_closure1 @ d62472f] Возможные решения: peek (java.util.function.Consumer), grep (), sleep (long), use ([Ljava.lang.Object;), grep (java.lang.Object), wait ()

long count = molportEntries.stream (). Count ();

работает без сообщения об ошибке.

molportEntries - это список BasicMolportEntry, который является простым классом Java

public class BasicMolportEntry {
    public BasicMolportEntry(String molportId, String etxcId, String smiles) {
        this.molportId = molportId == null ? "" : molportId;
        this.etxcId = etxcId == null ? "" : etxcId;
        this.smiles = smiles;
    }

плюс все обычные ...

Есть предложения?

1 Ответ

1 голос
/ 22 мая 2019

Следующий код:

class MolportEntryVerification {}
class BasicMolportEntry {}

def molportEntries = (1..200).collect { new BasicMolportEntry() }

def i = 0
List<MolportEntryVerification> result = molportEntries.stream()
  .peek { if(i++%50 == 0) { println(i-1) } }
  .map  { e -> new MolportEntryVerification() }
  .toList()

println "size: ${result.size()}"

, имитирующий код в вашем вопросе, отлично работает в groovy 2.5.7, разрывается с отсутствующим toList() (которого у вас нет в коде, но это сокращеннодля синтаксиса коллектора) в groovy 2.3.9 и разбивается со следующей ошибкой:

~> groovy solution.groovy

Caught: groovy.lang.MissingMethodException: No signature of method: java.util.stream.ReferencePipeline$Head.peek() is applicable for argument types: (solution$_run_closure2) values: [solution$_run_closure2@d706f19]
Possible solutions: peek(java.util.function.Consumer), grep(), sleep(long), use([Ljava.lang.Object;), grep(java.lang.Object), wait()
groovy.lang.MissingMethodException: No signature of method: java.util.stream.ReferencePipeline$Head.peek() is applicable for argument types: (solution$_run_closure2) values: [solution$_run_closure2@d706f19]
Possible solutions: peek(java.util.function.Consumer), grep(), sleep(long), use([Ljava.lang.Object;), grep(java.lang.Object), wait()
    at solution.run(solution.groovy:7)

в groovy 1.8.8.Это похоже на то же исключение MissingMethodException, с которым вы столкнулись.

Как уже упоминалось в комментарии, это похоже на проблему с отличной версией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...