3. lambda 方法引用
lambda 方法引用分为4类,方法引用也受到访问控制权限的限制,可以通过在引用位置是否能够调用被引用方法来判断。具体分类信息如下:
类型 |
使用方式 |
静态方法 |
ContainingClass::staticMethodName |
指定实例的方法 |
containingObject::instanceMethodName |
特定类实例的任意方法 |
ContainingType::methodName |
构造方法 |
ClassName::new |
- 引用静态方法 ContainingClass::staticMethodName 例子: String::valueOf,对应的Lambda:(s) -> String.valueOf(s) 比较容易理解,和静态方法调用相比,只是把.换为::
- 引用特定对象的实例方法 containingObject::instanceMethodName 例子: x::toString,对应的Lambda:() -> this.toString() 与引用静态方法相比,都换为实例的而已
- 引用特定类型的任意对象的实例方法 ContainingType::methodName 例子: String::toString,对应的Lambda:(s) -> s.toString() 太难以理解了。难以理解的东西,也难以维护。建议还是不要用该种方法引用。 实例方法要通过对象来调用,方法引用对应Lambda,Lambda的第一个参数会成为调用实例方法的对象。
- 引用构造函数 ClassName::new 例子: String::new,对应的Lambda:() -> new String() 构造函数本质上是静态方法,只是方法名字比较特殊。
1.引用静态方法
map 遍历
public static void domel4(){Map<String,String> mp=new HashMap<>();mp.put("1","1");mp.put("2","1");mp.put("3","1");//引用静态方法mp.forEach(LambdaTest::domel5);//静态方法的同效写法mp.forEach((k,v)-> domel5(k,v));//匿名函数写法mp.forEach((k,v)-> {System.out.println("key:"+k+";v:"+v);});
}
public static void domel5(String k,String v){System.out.println("key:"+k+";v:"+v);
}
排序案例
//创建实体
public class Person {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}//实例对象内部排序实现public int compare(Person p1, Person p2){return p1.getAge().compareTo(p2.getAge());}public int compareTo(Person p){return this.getName().compareTo(p.getName());}}// 实例工厂
public class PersonFactory {private Supplier<Person> supplier;public PersonFactory(Supplier<Person> supplier){this.supplier=supplier;}public Person getSupplierPerson() {return supplier.get();}
}// 排序案例
public class LambdaTestYY {public static void main(String[] arg){domel1();}static void domel1(){// 引用构造函数PersonFactory personFactory=new PersonFactory(Person::new);List<Person> personList = new ArrayList<>();Person p1 = personFactory.getSupplierPerson();p1.setName("Kobe");p1.setAge(18);personList.add(p1);Person p2 = personFactory.getSupplierPerson();p2.setName("James");p2.setAge(19);personList.add(p2);Person p3 = personFactory.getSupplierPerson();p3.setName("Paul");p3.setAge(15);personList.add(p3);Person[] persons1 = personList.toArray(new Person[personList.size()]);System.out.println("排序前");printArray(persons1);Arrays.sort(persons1,LambdaTestYY::myCompare);System.out.println("排序后");printArray(persons1);}private static void printArray(Person[] persons){for (Person person : persons) {System.out.println(String.format("name:%s;age:%d",person.getName(),person.getAge()));}}static int myCompare(Person p1, Person p2){return p1.getAge().compareTo(p2.getAge());}}
2.引用特定对象的实例方法
Person[] persons2 = personList.toArray(new Person[personList.size()]);
System.out.println("排序前");
printArray(persons2);
//引用特定对象的实例方法
Arrays.sort(persons2,p1::compare);
System.out.println("排序后");
printArray(persons2);
3.引用特定类型的任意对象的实例方法
System.out.println("**********************");
Person[] persons3 = personList.toArray(new Person[personList.size()]);
System.out.println("排序前");
printArray(persons3);
//引用特定类型的任意对象的实例方法
Arrays.sort(persons3,Person::compareTo);
System.out.println("排序后");
printArray(persons3);
4.引用构造方法
// 或者Supplier<Person> supplier=Person::new;
PersonFactory personFactory=new PersonFactory(Person::new);List<Person> personList = new ArrayList<>();
Person p1 = personFactory.getSupplierPerson();
p1.setName("Kobe");
p1.setAge(18);
personList.add(p1);
3. lambda 方法引用相关推荐
- lambda方法引用总结——烧脑吃透
lambda是java8的新特性,基本使用比较容易理解,但有一个环节遇到了坎儿,那就是方法引用,尤其是类的实例方法引用,烧脑之后总结一下. 在需要函数参数的方法中,我们可以把另一个同类型的方法直接传入 ...
- Lambda方法引用
1.Lambda表达式 1.1体验Lambda表达式[理解] 案例需求 启动一个线程,在控制台输出一句话:多线程程序启动了 实现方式一 实现步骤 定义一个类MyRunnable实现Runnable接口 ...
- 31.3 Java进阶之lambda方法引用
文章目录 1.方法引用 1.1 复用已有方法传递lambda 1.2 : :操作符 1.2.1 object::instanceMethod 1.2.2 Class::staticMethod 1.2 ...
- 【Java 进阶】匿名类(代码传递、回调、过滤器)、Lambda表达式(方法引用)、函数式接口(Supplier、Consumer、Predicate、Function)
匿名类 匿名类(Anonymous Class) 匿名类的使用注意 匿名类 - 代码传递 - 测试代码运行时间的工具类 匿名类 - 回调 - 简易网络请求 匿名类 - 过滤器 - 获取目录下的所有文件 ...
- jdk8新特性-Lambda表达式,方法引用
Lambda方法引用的概念 1).什么是"方法引用":当我们使用Lambda实现一些功能时,发现已有的类库中已经有方法实现了这样的功能,这时,我们就可以引用已实现的方法来代替Lam ...
- java写方法用来调用_Java从入门到入土(79)lambda表达式和方法引用
lambda表达式是Java8引入的新功能.lambda表达式以字面量的形式把少量代码直接写在程序中,从而让 Java 编程更符合函数式风格(Java 实质上是面向对象语言.不过,引入lambda 表 ...
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...
- Java 8 - 06 Lambda 和方法引用实战
文章目录 Pre 第 1 步:传递代码 第 2 步:使用匿名类 第 3 步:使用 Lambda 表达式 第 4 步:使用方法引用 Pre 前几篇文章,我们已经学习了行为参数化.匿名类.Lambda表达 ...
- Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法
今天我来聊聊 Java8 的一些新的特性,确实 Java8 的新特性的出现,给开发者带来了非常大的便利,可能刚刚开始的时候会有点不习惯的这种写法,但是,当你真正的熟悉了之后,你一定会爱上这些新的特性的 ...
最新文章
- 将socket设置为非阻塞(non-blocking) - 艾子的日志 - 网易博客
- Python open()函数用法详解
- 第一期赠书活动《硅谷百年史》已寄出
- [云炬商业计划书阅读分享]洗车店创业计划书
- Spring-Quartz (一)
- 2014-07-28 使用Axure RP进行手机端BBS的原型设计
- C#使用CLR/C++的DLL间接调用Native C++的DLL
- Android 13 第一个开发者版本来了,网友直呼:Android 12 还没玩透!
- 使用pipenv代替virtualenv管理python包
- java对csv格式的读写操作
- 有界、无界队列对ThreadPoolExcutor执行的影响
- 信庭嵌入式工作室-ARM应用技术之体系结构应用(中)
- 【pygame小游戏】摸鱼系列:”躲避粒子“小游戏在线玩,看谁才是”最强王者“?
- 客户成功团队的 OKR 案例
- 常微分方程数值解matlab欧拉,MATLAB题,用到欧拉公式求微分方程的数值解
- 使用 Mailgun 配置 Ghost 邮箱
- python游戏代码怎样才能玩好英雄联盟_怎样才能玩好英雄联盟-百度经验
- ROS----小乌龟画爱心
- 垃圾分类查询管理系统
- java scan.next_Java使用scanner.nextLine()
热门文章
- C# WinForm GUI之WinForm基础
- 数据采集,网站批量自动采集数据
- Linux C语言 pthread_cond_wait()、pthread_cond_timedwait()函数(不允许cond被唤醒时产生竞争,所以需要和互斥锁搭配)
- android虚拟按键实现,虚拟按键的实现
- when I want to have a rest
- 从网友评论中思考成长性思维和固定性思维
- vue 使用fs_在vue里面使用iVew框架
- mysql怎么快速删除亿级数据_mysql数据库如何实现亿级数据快速清理
- 华三模拟器之OSPF实验
- Q6:QIA一站式测试