2016-10-27 10 views
0

メソッドへの参照をパラメータとして渡すことはできますか?例えば関数参照をパラメータとして渡す

public static void main(String[] args) { 
    String data = "name: John, random text, address: leetStreet"; 
    Person person; 

    //if regex matches, use method reference, to send the result. 
    applyDataToPerson(data, "name: (\\w+)", person, Person::setName); 
    applyDataToPerson(data, "address: (\\w+)", person, Person::setAddress); 
} 

private static void applyDataToPerson(String data, String regex, Person person, 
Function<Person> f) { 
    Matcher match = Pattern.compile(regex).matcher(data); 
    if (match.matches()) person.f(match.group(1)); 
} 

class Person { 
    private String name; 
    private String address; 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 
} 

ない場合は、メソッドへの参照を与えることに代替どうなりますか?スイッチケースの構築?

+2

を既存のメソッド(他のものの中でも)に[メソッド参照](https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html)を渡すことができます – Tibrogargan

+0

@Tibrogarganメソッドの署名はどのように見えますか? 'Comparator 'は私には意味がありません。 – JasperJ

+1

「機能」とは何を表していますか?我々が['java.util.function.Function'](https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html)について言及している場合、2コードはコンパイルできません。(これは 'person.f(...) 'だけではありません)。 _alternatives_を要求する前に、作業コードがあることを確認してください... – Tunaki

答えて

5

は、私はあなたがBiConsumerを探していると思う:

private static void applyDataToPerson(String data, String regex, Person person, BiConsumer<Person, String> action) { 
    Matcher match = Pattern.compile(regex).matcher(data); 
    if (match.matches()) action.accept(person, match.group(1)); 
} 

また、あなたがメソッドのシグネチャを短縮し、あなたのperson参照捉え単一引数Consumer使用することができます。Java 8で

public static void main(String[] args) { 
    String data = "name: John, random text, address: leetStreet"; 
    Person person; 

    //if regex matches, use method reference, to send the result. 
    applyData(data, "name: (\\w+)", person::setName); 
    applyData(data, "address: (\\w+)", person::setAddress); 
} 

private static void applyData(String data, String regex, Consumer<String> action) { 
    Matcher match = Pattern.compile(regex).matcher(data); 
    if (match.matches()) action.accept(match.group(1)); 
} 
+0

メインメソッドでbiconsumer関数を記述してください: 'applyDataToPerson(data、" name:(\\ w +) "、person、(Person p、String s) > p.setName(s)); " – gaston

+2

@gastonいいえ、主な方法は、OPが持っていたのとまったく同じです。 – shmosel

+2

個人的に私は第2の選択肢が好きです。 –

関連する問題