2016-11-19 34 views
-1

我有ArrayList和lambda表达式的问题。我有代码:ArrayList上的Lambda表达式

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 

我应该如何为每个lambda表达式实现(e, i)

void letsGo(Function function) 

你能帮我实施吗?如何从参数中获取lambda表达式?我知道apply方法,但我不知道如何使用它..

+0

首先,如果你知道了'apply'方法,为什么不打电话了吗?其次,'Function'只需要一个参数,但你的lambda需要两个参数。因此它们不兼容。在不知道'set'的签名的情况下,我不能提出另一种选择。 –

+0

'letsGo'方法应该做什么? – Andrew

+0

执行拉姆达,在该表达式,每个元素由对子级由元件代替* 2 – Alohomora

回答

0

如果你想实现一个letsGo()方法,可以使用带有两个输入的lambda表达式,那么我认为你想签名

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

我不相信这是设计类的最佳方法(我已经预计需要的功能的方法,和更新:像以下(假设MyListT类型参数化)所有的值在原地,如Stream.map()确实,而不需要在您的lambda中调用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,?超级整数>'可能会有所改进。 –

+1

大多数集合,包括'HashMap',在迭代时都不喜欢被操纵。它可能在这个特定的情况下工作,但仍然不是实现它的正确方法。毕竟,为什么要为每个元素执行哈希查找,当有一个像'replaceAll'这样的现成方法可以在没有额外查找的情况下完成这项工作。此外,为什么使用'Map '而不是'List '? 。 – Holger

+0

如果你坚持到'Map'方法,您可以替换'values.entrySet()的forEach(E - > consumer.accept(e.getValue(),e.​​getKey()));'用简单得多' values.forEach(消费者);' – Holger