簡體   English   中英

有沒有一種方法可以將Java代碼段作為Groovy Closure傳遞給方法參數?

[英]Is there a way to pass Java code sniplet as Groovy Closure in method param?

我目前正在將具有方法的舊式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類?

謝謝

您可以嘗試使用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 + "'");
        }
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM