关于Lambda表达式的方法引用和构造器引用简的单示例

作者:CrazyDragon_King 时间:2022-09-18 05:02:08 

方法引用和构造器引用

了解了 Lambda 表达式有一段时间了,但是都没有怎么练习,一直停留在最低层次的了解程度,这对于追求技术进步的人来说确实不是太好,所以就来继续深入学习以下。

使用要求:

如果Lambda表达式的代码块只有一条代码,程序就可以省略 Lambda 表达式中的代码块和花括号,还可以使用方法引用与构造器引用

作用:

方法引用与构造器引用可以使 Lambda 表达式的代码块更加简洁(可能代码越短越好吧!)

使用:

方法引用与构造器引用都需要使用两个冒号::

Lambda支持的方法引用和构造器引用

种类示例说明
引用类方法Integer::valueOf函数式接口中被实现方法的全部参数传给该类方法作为参数
引用特定对象的实例方法System.out::println函数式接口中被实现方法的全部参数传给该方法作为参数
引用某类对象的实例方法

System.out::println

函数式接口中被实现方法的第一个参数作为调用者,后面的参数全部传给该方法作为参数
引用构造器Dog::new函数式接口中被实现方法的全部参数传给该构造器作为参数

代码:

定义需要使用的函数式接口

@FunctionalInterface
interface Instance<E>{
E get(String name, int age);
}

@FunctionalInterface
interface Converter{
Integer converter(String age);
}

@FunctionalInterface
interface Say{
String say(Dog dog, String hobby);
}

定义一个 Dog 类,作为示例使用

class Dog{
private String name;
private int age;

public Dog(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void grow(Converter con, String age) {
this.age = con.converter(age);
}

public int getNameLength(String name) {
return name.length();
}

public String hobby(String hobby) {
return this.toString()+" I love "+hobby;
}

@Override
public String toString() {
return "Dog [name=" + name + ", age=" + age + "]";
}
}

测试代码

我把没有使用方法引用和构造器引用的代码注释了,并且就放在 Lambda 表达式上面,用作对比参考。

public class Client {
public static void main(String[] args) {
//使用方法引用和构造器引用使得 Lambda 表达式更加简洁
/*
* 1.引用构造器
* */
//Instance<Dog> instance1 = (name, age)->new Dog(name,age);
Instance<Dog> instance = Dog::new;
Dog dog = instance.get("小黑", 12);
String str = dog.toString();
System.out.println(str);

/*
* 2.引用类方法
* */
//Converter converter1 = age->Integer.valueOf(age);
Converter converter1 = Integer::valueOf;
dog.grow(converter1,"18");
System.out.println(dog.toString());

/*
* 3.引用特定对象的实例方法
* */
//Converter converter2 = name->dog.getNameLength(name);
Converter converter2 = dog::getNameLength;
int len = converter2.converter(dog.getName());
System.out.println("dog 的名字有:"+len+" 个字符!");

/*
* 4.引用某类对象的实例方法
* */
//Say say1 = (dog1,hobby)->dog1.hobby(hobby);
Say dogSay = Dog::hobby;
String str1 = dogSay.say(dog, "running!");
System.out.println(str1);
}
}

运行截图

关于Lambda表达式的方法引用和构造器引用简的单示例

学以致用
学习是为了更好的理解,下面来举一个简单的例子,来看看这个的应用。
**忽略这里的 Comparable接口 **

public class Dog implements Comparable<Dog>{
private String name;
private int age;

public Dog(String name, int age) {
this.name = name;
this.age = age;
}

public int getAge() {
return age;
}

@Override
public int compareTo(Dog dog) {
return this.age > dog.age ? 1 : this.age < dog.age ? -1 : 0;
}

@Override
public String toString() {
return "Dog [name=" + name + ", age=" + age + "]";
}
}

测试代码

public class ClientTest {
public static void main(String[] args) {
LinkedList<Dog> list = new LinkedList<>();
list.add(new Dog("大黄",12));
list.add(new Dog("小黑",13));
list.add(new Dog("二哈",11));
list.add(new Dog("小白",9));
list.add(new Dog("旺财",8));

//引用特定对象的实例方法
Consumer<Dog> consumer = System.out::println;  
list.forEach(consumer);    

System.out.println("-------模拟上面的 foreach 方法-----------");
Consumer<Dog> con = dog->System.out.println(dog);
for (Dog dog : list ) {
con.accept(dog);
}
}
}

说明
注意上面那个方法list.forEach(consumer);
这个方法的参数是一个函数式接口对象,就是传入一个 lambda 表达式,它本身是使用了 方法引用(引用特定对象的方法 System.outPrintStream 的对象),但是为什么传入一个 接口对象就能实现打印输出(也可以根据自己写的 Lambda 表达式 完成具体功能)?
保持对问题的好奇心,可以思考以下,下面是我模拟的结果,因为最终要完成还是需要借助于方法来进行的,可以打开 Consumer 接口,里面只有一个 accept 方法,很容易就能想到,借助 foreach 循环进行遍历操作。
我们查看 list.forEach 的 API 就能看出来,实现大致如此,只不过加了一个null值处理。

运行结果:

关于Lambda表达式的方法引用和构造器引用简的单示例

来源:https://blog.csdn.net/qq_40734247/article/details/102651123

标签:Lambda,方法引用,构造器引用
0
投稿

猜你喜欢

  • C++普通函数指针与成员函数指针实例解析

    2022-09-29 10:19:36
  • 使用IDEA搭建一个简单的SpringBoot项目超详细过程

    2022-07-19 11:43:58
  • android中AutoCompleteTextView的简单用法(实现搜索历史)

    2023-01-08 18:33:01
  • MTK Android平台开发流程

    2023-06-23 08:59:11
  • 云计算实验:Java MapReduce编程

    2021-10-08 14:25:52
  • 详解C语言结构体,枚举,联合体的使用

    2021-10-12 09:37:01
  • 关于Android中自定义ClassLoader耗时问题的追查

    2021-08-10 06:15:23
  • C#集合遍历时删除和增加元素的方法

    2021-12-11 18:53:24
  • MyEclipse去除网上复制下来的代码带有的行号(正则去除行号)

    2023-09-15 21:59:23
  • java实现抽奖功能解析

    2021-08-29 16:08:21
  • C++实现企业职工工资管理系统

    2023-11-02 17:34:34
  • 详解C语言实现猜数字游戏

    2023-11-03 04:58:51
  • Java中StringBuilder与StringBuffer使用及源码解读

    2022-05-16 09:11:18
  • C# CheckedListBox控件的用法总结

    2023-09-17 13:23:34
  • SpringBoot @ConfigurationProperties注解的简单使用

    2021-09-03 12:21:57
  • 如何关闭 IDEA 自动更新

    2021-11-04 17:17:30
  • android自定义ImageView仿图片上传示例

    2023-08-11 20:34:08
  • RecyclerView中监听EditText变化的BUG的解决方法

    2022-08-07 20:44:25
  • C# 如何实现一个带通知的List<T>

    2022-08-05 03:40:26
  • Java中利用gson解析Json实例教程

    2023-10-31 04:07:41
  • asp之家 软件编程 m.aspxhome.com