当前位置: 首页 > 知识库问答 >
问题:

带方法参考说明的forEach列表

段干弘扬
2023-03-14

过去几个月我一直在学习java,刚刚开始进入lambda函数。我最近切换了我的IDE,并注意到在这样的代码上有一个警告说“可以用方法引用替换”。

   List<Integer> intList = new ArrayList<>();
        intList.add(1);
        intList.add(2);
        intList.add(3);

        intList.forEach(num -> doSomething(num));

    voiddoSomething(int num) {
        System.out.println("Number is: " + num);
    }

经过一番挖掘,我意识到

 intList.forEach(num -> doSomething(num));

我可以用

 intList.forEach(this::doSomething);

这太神奇了。几天前我甚至不知道lambdas,并且正在使用for循环来进行这样的操作。现在我用lambdas替换了我的for循环,更好的是,我可以用方法引用替换我的lambdas。问题是我并不真正了解这一切在内部是如何工作的。有人能解释或提供一个好的资源来解释当我们使用方法引用时如何调用doThings函数并将参数传递给它吗?

共有3个答案

边银龙
2023-03-14

鉴于您提到直到最近您才开始进入函数式编程,我希望让事情尽可能简单明了,但请注意,只需您提供的小代码,我们就可以从事物的高级视图中获得很多东西以及低级视图。

任何人都可以解释或提供一个很好的资源来解释当我们使用方法引用时,如何调用doSomething函数并将参数传递给它?

如何调用 doSomething 函数留给库(内部迭代),无论我们是使用方法引用还是 lambda 表达式,因此,从本质上讲,我们指定了要为源 intList 的每个元素执行的行为(函数),而不是它应如何进行其工作。

然后将其留给库来应用(执行)指定的 do 函数某一功能用于源 intList 的每个元素。

方法引用可以看作是仅调用特定方法的 lambda 的简写。这里的好处是,通过显式引用特定方法名称,您的代码可以获得更好的可读性,因此,使其更易于阅读和遵循,并且在大多数情况下,使用方法引用读取代码会读作问题陈述,这是一件好事。

同样重要的是要知道,不是任何给定函数都可以传递给forEach终端操作,因为每个接受行为的方法都对允许的函数类型有限制。这是通过使用java.util中的函数接口实现的。函数包。

最后但并非最不重要的一点是,在重构方面,并不总是可以使用方法引用,使用lambdas表达式而不是我们在Java-8之前使用的代码也并不总是更好。但是,随着您继续学习Java-8功能的旅程,请尝试一些改进代码的技巧:

  • 将匿名类重构为lambda表达式
  • 将lambda表达式重构为方法引用
  • 将命令式数据处理重构为流
金钊
2023-03-14

双冒号只是用于定义lambda表达式的语法糖,其参数和返回类型与现有函数相同。它的创建是为了允许lambda更容易地与现有代码库一起添加。

调用< code >列表的< code>forEach方法

因此,可以使用双冒号作为lambda表达式的语法糖。

一般来说,如果你有一个对象obj方法func,它接受参数params…然后编写obj::func等价于lambda(params…)-

在您的例子中,othis(当前对象),它有一个方法doThings(),它接受一个整数参数,因此,this::doThings等价于num-

南宫鸿晖
2023-03-14

双冒号运算符只是一个方便的运算符,用于执行与 lambda 相同的操作。查看此页面了解更多详情: https://javapapers.com/core-java/java-method-reference/

 类似资料:
  • 问题内容: 你能解释一下方法吗。 我阅读了文档,它具有三个参数: :项目在我们想要其视图的项目的适配器数据集中的位置。 :如果可能,请重用旧视图。注意:使用前,应检查此视图是否为非null并具有适当的类型。如果无法转换此视图以显示正确的数据,则此方法可以创建一个新视图。 异构列表可以指定其视图类型的数量,以便此View始终具有正确的类型(请参见getViewTypeCount()和getItemV

  • 本文向大家介绍JAVA String.valueOf()方法的用法说明,包括了JAVA String.valueOf()方法的用法说明的使用技巧和注意事项,需要的朋友参考一下 一、由基本数据型态转换成String String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 ,也就是 String.valueOf() 这个参数多载的方法 有以下几种 (1)String.

  • 问题内容: 我正在使用Twitter4J。但是我要问的问题比较笼统。我想访问给定推文的用户ID。目前,我有以下两种选择: 我不喜欢第一个选项中的lambda表达式,也不喜欢在第二个选项中被迫调用两个。有没有办法建立方法引用链?我知道这行不通,但是我想知道是否还有其他选择。 问题答案: 不,这是两种方法。其他任何事情最终都只会变得不清楚。 但是,自您提出要求以来,这里有一些选择。 要么

  • 方法引用有助于通过名称指向方法。 使用“::”符号描述方法参考。 方法参考可用于指出以下类型的方法 - 静态方法 实例方法 使用new运算符的构造函数(TreeSet :: new) 方法参考示例 使用您选择的任何编辑器创建以下Java程序,例如C:\> JAVA。 Java8Tester.java import java.util.List; import java.util.ArrayList

  • 我试图塑造Swagger-UI,以便不仅修改那个“名称”字段,还修改一个应用编程接口输入参数的“描述”字段。这里有一个例子,有人似乎成功地做到了这一点,同时利用了@ApiParam和@recestParam:[链接] 到目前为止,我最接近修改描述字段的是以下内容,其中我在@recestParam输入中单独使用了"value"字段: 但是,每当我尝试在单个输入元素上同时使用@ApiParam和@Re

  • 问题内容: 有人可以向我解释静态HashMap#hash(int)方法吗? 产生均匀分布的哈希的背后的理由是什么? 一个例子将使它更容易消化。 澄清 我知道运算符,真值表和按位运算。我只是无法真正解码实现,也无法真正评论。甚至是背后的原因。 问题答案: 是逻辑右移(无符号扩展)(JLS 15.19 Shift Operators ),并且是按位异或(JLS 15.22.1 Integer Bitw