2016-11-19 2 views
-1

У меня проблема с ArrayList и выражения лямбда. У меня есть код:Lambda выражение на 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' методе, то почему бы не назвать его? Во-вторых, функция 'Function' принимает только один аргумент, но ваша лямбда занимает два. Таким образом, они несовместимы. И, не зная подписи 'set', я не могу предложить альтернативу. –

+0

Что должен делать метод 'letGo'? – Andrew

+0

выполнить лямбда, в этом выражении каждый элемент, заменяемый элементом * 2 – Alohomora

ответ

0

Если вы пытаетесь реализовать метод letsGo(), который может использовать выражение лямбда с двумя входами, тогда я думаю, что вы хотите, чтобы подпись быть как показано ниже (предполагающей MyList параметризуется по типу T):

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

Я не уверен, что это лучший способ создать свой класс (я бы ожидал метод, который принимает функцию и обновления все значения in-situ, например 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 'может немного улучшиться. –

+1

Большинство коллекций, в том числе 'HashMap', не любят манипулировать во время повтора. Он может работать в этом конкретном случае, но все же это не правильный способ его достижения. В конце концов, зачем выполнять хеш-поиск для каждого элемента, когда есть готовый метод, подобный 'replaceAll', который выполняет работу без дополнительного поиска. Кроме того, зачем использовать 'Map ' вместо 'List '? – Holger

+0

Если вы придерживаетесь подхода «Карта», вы можете заменить 'values.entrySet(). ForEach (e -> consumer.accept (e.getValue(), e.getKey()));' с гораздо более простым ' values.forEach (потребитель); ' – Holger

Смежные вопросы