Если вы пытаетесь реализовать метод 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}
}
}
Прежде всего, если вы знаете о 'apply' методе, то почему бы не назвать его? Во-вторых, функция 'Function' принимает только один аргумент, но ваша лямбда занимает два. Таким образом, они несовместимы. И, не зная подписи 'set', я не могу предложить альтернативу. –
Что должен делать метод 'letGo'? – Andrew
выполнить лямбда, в этом выражении каждый элемент, заменяемый элементом * 2 – Alohomora