【问题标题】:Lambda expression on ArrayListArrayList 上的 Lambda 表达式
【发布时间】:2017-04-03 12:46:36
【问题描述】:

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

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

void letsGo(Function function)

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

【问题讨论】:

  • 首先,如果您知道apply 方法,为什么不直接调用它呢?其次,Function 只需要一个参数,但您的 lambda 需要两个参数。因此它们不兼容。在不知道set 的签名的情况下,我无法提出替代方案。
  • letsGo 方法应该做什么?
  • 执行 lambda,在那个表达式中,每个元素都应该被 element * 2 替换
  • List&lt;Integer&gt; list=Arrays.asList(1, 2, 8, 10, 11, 30, 3, 4); list.replaceAll(e-&gt;e*2); 你的MyList 课程有什么好处?

标签: java arraylist lambda java-8


【解决方案1】:

如果您尝试实现可以​​使用具有两个输入的 lambda 表达式的 letsGo() 方法,那么我认为您希望签名如下所示(假设 MyList 由类型 T 参数化) :

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

我不相信这是设计你的类的最佳方式(我希望有一个方法可以接受一个函数,并就地更新所有值,就像Stream.map() 所做的那样,而不是需要调用list.set() 在你的 lambda 中)

显然,如何实现此方法取决于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}
    }
}

【讨论】:

  • BiConsumer&lt;? super T, ? super Integer&gt; 可能会有所改进。
  • 大多数集合,包括HashMap,都不喜欢在被迭代时被操纵。它可能在这种特定情况下有效,但仍然不是实现它的正确方法。毕竟,当有像replaceAll 这样的现成方法无需额外查找即可完成工作时,为什么要对每个元素执行哈希查找。此外,为什么使用Map&lt;Integer, T&gt; 而不是List&lt;T&gt;
  • 如果您坚持使用Map 方法,您可以将values.entrySet().forEach(e -&gt; consumer.accept(e.getValue(), e.getKey())); 替换为更简单的values.forEach(consumer);
猜你喜欢
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2023-03-10
相关资源
最近更新 更多