2017-05-19 2 views
9

Beanのゲッターを関数として渡したいと思います。関数が呼び出されると、ゲッターが呼び出されます。例:ラムダ関数としてゲッターを渡すには?

public class MyConverter { 
    public MyConverter(Function f) { 
      this.f = f; 
    } 

    public void process(DTO dto) { 
     // I just want to call the function with the dto, and the DTO::getList should be called 
     List<?> list = f.call(dto); 
    } 
} 

public class DTO { 
    private List<String> list; 
    public List<String> getList() { return list; } 
} 

Java 8でも可能ですか?

+0

は、私が聞いても?結果と一緒に 'process'メソッドで何をしていますか?与えられた値を(提供された関数を介して)結果にマップして実際に処理する必要があるように聞こえるので私は尋ねています。実際、「MyConverter」クラスはコンバータよりもプロセッサのように見えます。 –

答えて

12

MyConverterのコンストラクタ関数を取らなければならない、とprocessがオブジェクトを取る必要がある場合、これはおそらく最良の方法です:あなたは `MyConverter`クラスの機能をカプセル化する必要がある理由

class MyConverter<T> { 
    //    V takes a thing (in our case a DTO) 
    //      V returns a list of Strings 
    private Function<T, List<String>> f; 

    public MyConverter(Function<T, List<String>> f) { 
      this.f = f; 
    } 

    public void process(T processable) { 
     List<String> list = f.apply(processable); 
    } 
} 

MyConverter<DTO> converter = new MyConverter<>(DTO::getList); 

DTO dto = new DTO(); 
converter.process(dto); 
+0

dto *インスタンス*をコンストラクタに渡すことができません。 'process(dto)'にインスタンス(インスタンスのみ)を渡す必要があります。したがって、何らかの形でgetterをコンストラクタに渡さなければなりません。 – membersound

+0

普通のpublic void process(Dto dto){List list = dto.getList();の何が問題なのですか。 } '? – Michael

+0

私の目標は、 'Converter'が' DTO'の実装について知っていて、オブジェクトデータ 'getList()'の取得方法を知らないということです。それは外から渡されるべきです、そうでなければ私はコンバータを必要としません。 – membersound

関連する問題