【问题标题】:What's the advantage of using method references in this case?在这种情况下使用方法引用有什么好处?
【发布时间】:2015-02-19 19:11:19
【问题描述】:

我有两个变量如下:

List<Basket> bigBasket = new ArrayList<>(); Basket basket = new Basket();

我编写了以下代码来添加bigBasketbasket中的项目之间的关系:

for (Fruit specialFruit : bigBasket.get(0).getFruitInBasket()) {
    for (Fruit fruit : basket.getFruitInBasket()) {
        specialFruit.addRelationship(fruit);
    }
}

现在一切都很好,但是 IntelliJ 检查了代码并提出使用方法参考来改进它,所以我得到了以下信息:

for (Fruit specialFruit : bigBasket.get(0).getFruitInBasket()) {
   basket.getFruitInBasket().forEach(specialFruit::addRelationship);
}

所以上面的行数较少,但它的实际优势是什么?我并不完全了解 Java 8 功能的好处,所以这可能就是我不太了解正在发生的事情的原因。

在我看来,假设您对 Java 8 功能了解不多,那么“改进”版本的代码在立即理解正在发生的事情和标准 for 循环的意义上不是很易读。

有人能解释一下“改进”代码与标准 for 循环的好处吗?

编辑:删除了对 lambdas 的不正确引用。代码只是使用了方法引用——这只是我的一个术语错误!

【问题讨论】:

  • 也许只是方法引用对您来说看起来不直观? bigBasket.get(0).getFruitInBasket().forEach(specialFruit -&gt; basket.getFruitInBasket().forEach(fruit -&gt; specialFruit.addRelationship(fruit) )); 怎么样?
  • 当然,一个成语对于不熟悉它的人来说是无法阅读的,但这只是一个不言而喻的道理。真正相关的一点是:对于同样熟悉 both 习语的人来说,哪一个更易读?对我来说,forEach 构造要容易得多,因为要检查的东西更少,可以确定 sn-p 的作用。

标签: java java-8 method-reference


【解决方案1】:

我认为“改进”的代码在性能方面没有任何优势。两个 sn-ps 都会遍历整个 basket.getFruitInBasket() 集合,并对每个元素执行完全相同的操作。

偏爱其中一种方式只是口味问题。在我看来,Java 8 版本更清楚地表达了您对 Collection 的所有元素执行单个操作的事实(假设您习惯于方法引用)。

顺便说一句,您的代码中没有 lambda 表达式,只是一个方法引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    相关资源
    最近更新 更多