关于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);
}
}
运行截图
学以致用
学习是为了更好的理解,下面来举一个简单的例子,来看看这个的应用。
**忽略这里的 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.out
是 PrintStream
的对象),但是为什么传入一个 接口对象就能实现打印输出(也可以根据自己写的 Lambda 表达式 完成具体功能)?
保持对问题的好奇心,可以思考以下,下面是我模拟的结果,因为最终要完成还是需要借助于方法来进行的,可以打开 Consumer
接口,里面只有一个 accept
方法,很容易就能想到,借助 foreach 循环进行遍历操作。
我们查看 list.forEach
的 API 就能看出来,实现大致如此,只不过加了一个null
值处理。
运行结果:
来源:https://blog.csdn.net/qq_40734247/article/details/102651123


猜你喜欢
- 一、树的概念和结构1.1 树的概念树是一种非线性的数据结构,它是由 n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因
- Vector简介ArrayList 和 Vector 其实大同小异,基本结构都差不多,但是一些细节上有区别:比如线程安全与否,扩容的大小等,
- java掩码 private static String nameMask(String name) throws Exception {
- SpringMVC获取表单数据1、实体类package cn.hadron.bean;import java.io.Serializable
- 一般对于业务复杂的流程,会有一些处理逻辑不需要及时返回,甚至不需要返回值,但是如果充斥在主流程中,占用大量时间来处理,就可以通过异步的方式来
- Shiro是什么Shiro是一个Java平台的开源权限框架,用于认证和访问授权。具体来说,满足对如下元素的支持:用户,角色,权限(仅仅是操作
- 这篇文章主要介绍了Spring Cloud基于zuul实现网关过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- strings.xml 有很多需要注意的地方和一些小技巧,知道了这些可以让你的 Android 应用更加规范易用,感兴趣的小伙伴们可以参考一
- maven打包指定jdk的版本问题今天遇到个问题,项目中新写了一个接口,其中用到了lambda表达式,本地跑是没问题的,但提交到gitLab
- 通过 SpringBoot 实现了表单下的文件上传,前后端分离情况下的文件上传。本案例不连接数据库,只做基本的文件上传操作。在 Spring
- Redisson是架设在redis基础上的一个Java驻内存数据网格(In-Memory Data Grid)。充分的利用了Redis键值数
- Spring JPA 增加字段执行异常用Spring jpa Entity里面增加了几个字段,但启动报错,提示column Unable t
- 因为在准备讲Maven用Maven Helper插件的时候,在网上学习,发现资料很少,我就把自己研究的配置分享给大家!!IDEA(本人用的2
- 一、判断一个字符串str不为空的方法有:1、str == null;2、"".equals(str);3、str.len
- C语言 strcmp() 函数用于对两个字符串进行比较(区分大小写)。头文件:string.h语法/原型:int strcmp(const
- 在查询时经常出现一对多”的关系,所有会出现嵌套对象的情况,Mybatis在resultMap提供了collection标
- 冒泡排序原理:从头(左边)开始比较每一对相邻的元素,如果第1个比第2个大,就交换它们的位置,执行完一轮后,最末尾(最右边)就是最大的元素。举
- 概述1、邮件相关的标准厂商所提供的 JavaMail 服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括:SMTP(Simple Ma
- 在java中调用xls格式化xml 使用javax.xml.transform.Transformer,将xml用xls格式化为另一种xml
- 现在Android上架各大平台都要求App首页添加一个弹框,显示用户协议以及一些隐私政策,不然上架各大平台,现在就来简单的实现一下这个对话框