Есть ли способ передать фрагмент кода Java как Groovy Closure в методе param? - PullRequest
1 голос
/ 15 марта 2019

В настоящее время я перевожу устаревший класс groovy с методами на Java, и для большинства методов это было легко с небольшими изменениями. Теперь я застрял в методе, который принимает замыкание как параметр:

transformer.renameNumbers([:], { Number->
        return "${number.name}@somecompany.com"
    })
}

реализация renameNumbers:

renameNumbers(Map<String,String> renameMap, someclosure = {it}) {
    numbers.each { it->

        if(newUsername == null ) {
            newNumbername = someclosure.call(it)
        }
        if(newNumbername!=null && newNumbername!=it.number) {
            def oldNumber= it.number
            it.number = newNumbername

            log.info("Changed numbername key of  from '$oldNumber' to '$newNumbername'")
        }
    }

Проблема в том, что если я попытаюсь просто передать: transformer.renameNumbers(Map, Object)

жалуется:

groovy.lang.MissingMethodException: No signature of method: org.eclipse.emf.ecore.util.EObjectContainmen.call() is applicable for argument types:

Полагаю, это потому, что в моем обычном Java-объекте нет методов call (). Есть ли способ обойти это? Например, если я создаю пользовательский класс Java с пользовательским методом вызова?

Спасибо

1 Ответ

0 голосов
/ 15 марта 2019

Вы можете попробовать использовать функциональные интерфейсы Java 8s , например Function<T,R> и Lambdas:

//Function<Number, String> f = (n) -> n.name + "@somecompany.com";
transformer.renameNumbers(new HashMap<>(), (n) -> n.name + "@somecompany.com");

Использование:

void renameNumbers(Map<String, String> renameMap, Function<Number, String> somefunction) {
    numbers.forEach(it -> {
        String newNumbername = somefunction.apply(it); // <-----
        if (newNumbername != null && newNumbername != it.number) {
            String oldNumber = it.number; 
            it.number = newNumbername;
            log.info("Changed numbername key of  from '" + oldNumber + "' to '" + newNumbername + "'");
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...