2016-11-19 17 views
-1

ArrayListとラムダ式に問題があります。私はコードを持っています:ArrayListのラムダ式

MyList<Integer> list = MyList.make(1,2,8, 10, 11, 30, 3, 4); 
list.letsGo((e, i) -> list.set(i, e*2)); 

e - element 
i - index 

(e, i)ですべてのラムダ式に実装する必要がありますか?

void letsGo(Function function) 

実装にお役立てください。どのように引数からラムダ式を取得するには?私はapplyメソッドについて知っていますが、それを使う方法はわかりません。

+0

まずあなたが 'apply'方法を知っているならば、なぜそれを呼び出しますか?第2に、「関数」は1つの引数を取るだけですが、ラムダは2つの引数をとります。したがって、互換性はありません。そして、 'set'のシグネチャを知らなくても、私は選択肢を提案できません。 –

+0

'letsGo'メソッドは何をすべきですか? – Andrew

+0

ラムダを実行します。その式では、要素* 2で置き換えられるすべての要素がリストされます。 – Alohomora

答えて

0

2入力のラムダ式を使用できるletsGo()メソッドを実装しようとしている場合は、 (タイプTによってパラメータ化されたMyListと仮定して)、次のようになる:

void letsGo(BiConsumer<? super T, ? super Integer> consumer) 

私はこれが(私は機能を取る方法を期待しているだろう、あなたのクラスを設計するための最良の方法です確信していない、とアップデートすべての値は、Stream.map()のように、ラムダでlist.set()と呼ぶ必要はありません)

あなたは、このメソッドを実装する方法を明らか

方法MyList実装されているに依存しますが、例では、次のことができます:全ての

public class MyList<T> { 
    private Map<Integer, T> values = new HashMap<>(); 

    public void set(int i, T value) { 
     values.put(i, value); 
    } 

    public void letsGo(BiConsumer<? super T, ? super Integer> consumer) { 
     System.out.println("Let's Go"); 
     values.entrySet().forEach(e -> consumer.accept(e.getValue(), e.getKey())); 
    } 

    @Override 
    public String toString() { 
     return values.toString(); 
    } 

    public static void main(String[] args) { 
     MyList<Integer> myList = new MyList<>(); 
     myList.set(0, 0); 
     myList.set(1, 1); 
     myList.set(2, 2); 

     System.out.println(myList.toString()); 
     myList.letsGo((e, i) -> myList.set(i, e * 2)); 
     System.out.println(myList.toString()); 

     // Output: 
     // {0=0, 1=1, 2=2} 
     // Let's Go 
     // {0=0, 1=2, 2=4} 
    } 
} 
+1

'BiConsumer <?スーパーT、? super Integer> 'が少し改良されているかもしれません。 –

+1

'HashMap'を含むほとんどのコレクションは、反復中に操作するのが好きではありません。この特定のケースでは機能するかもしれませんが、それを達成するための正しい方法ではありません。結局のところ、追加の検索なしでジョブを実行する 'replaceAll'のような既成のメソッドがある場合、なぜすべての要素に対してハッシュルックアップを実行するのですか?さらに、 'List 'の代わりに 'Map 'を使うのはなぜですか? – Holger

+0

'Map'アプローチに固執すれば、' values.entrySet()。forEach(e - > consumer.accept(e.getValue()、e.getKey())); ' values.forEach(コンシューマ); ' – Holger