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 方法引用相关推荐

  1. lambda方法引用总结——烧脑吃透

    lambda是java8的新特性,基本使用比较容易理解,但有一个环节遇到了坎儿,那就是方法引用,尤其是类的实例方法引用,烧脑之后总结一下. 在需要函数参数的方法中,我们可以把另一个同类型的方法直接传入 ...

  2. Lambda方法引用

    1.Lambda表达式 1.1体验Lambda表达式[理解] 案例需求 启动一个线程,在控制台输出一句话:多线程程序启动了 实现方式一 实现步骤 定义一个类MyRunnable实现Runnable接口 ...

  3. 31.3 Java进阶之lambda方法引用

    文章目录 1.方法引用 1.1 复用已有方法传递lambda 1.2 : :操作符 1.2.1 object::instanceMethod 1.2.2 Class::staticMethod 1.2 ...

  4. 【Java 进阶】匿名类(代码传递、回调、过滤器)、Lambda表达式(方法引用)、函数式接口(Supplier、Consumer、Predicate、Function)

    匿名类 匿名类(Anonymous Class) 匿名类的使用注意 匿名类 - 代码传递 - 测试代码运行时间的工具类 匿名类 - 回调 - 简易网络请求 匿名类 - 过滤器 - 获取目录下的所有文件 ...

  5. jdk8新特性-Lambda表达式,方法引用

    Lambda方法引用的概念 1).什么是"方法引用":当我们使用Lambda实现一些功能时,发现已有的类库中已经有方法实现了这样的功能,这时,我们就可以引用已实现的方法来代替Lam ...

  6. java写方法用来调用_Java从入门到入土(79)lambda表达式和方法引用

    lambda表达式是Java8引入的新功能.lambda表达式以字面量的形式把少量代码直接写在程序中,从而让 Java 编程更符合函数式风格(Java 实质上是面向对象语言.不过,引入lambda 表 ...

  7. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  8. Java 8 - 06 Lambda 和方法引用实战

    文章目录 Pre 第 1 步:传递代码 第 2 步:使用匿名类 第 3 步:使用 Lambda 表达式 第 4 步:使用方法引用 Pre 前几篇文章,我们已经学习了行为参数化.匿名类.Lambda表达 ...

  9. Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法

    今天我来聊聊 Java8 的一些新的特性,确实 Java8 的新特性的出现,给开发者带来了非常大的便利,可能刚刚开始的时候会有点不习惯的这种写法,但是,当你真正的熟悉了之后,你一定会爱上这些新的特性的 ...

最新文章

  1. 将socket设置为非阻塞(non-blocking) - 艾子的日志 - 网易博客
  2. Python open()函数用法详解
  3. 第一期赠书活动《硅谷百年史》已寄出
  4. [云炬商业计划书阅读分享]洗车店创业计划书
  5. Spring-Quartz (一)
  6. 2014-07-28 使用Axure RP进行手机端BBS的原型设计
  7. C#使用CLR/C++的DLL间接调用Native C++的DLL
  8. Android 13 第一个开发者版本来了,网友直呼:Android 12 还没玩透!
  9. 使用pipenv代替virtualenv管理python包
  10. java对csv格式的读写操作
  11. 有界、无界队列对ThreadPoolExcutor执行的影响
  12. 信庭嵌入式工作室-ARM应用技术之体系结构应用(中)
  13. 【pygame小游戏】摸鱼系列:”躲避粒子“小游戏在线玩,看谁才是”最强王者“?
  14. 客户成功团队的 OKR 案例
  15. 常微分方程数值解matlab欧拉,MATLAB题,用到欧拉公式求微分方程的数值解
  16. 使用 Mailgun 配置 Ghost 邮箱
  17. python游戏代码怎样才能玩好英雄联盟_怎样才能玩好英雄联盟-百度经验
  18. ROS----小乌龟画爱心
  19. 垃圾分类查询管理系统
  20. java scan.next_Java使用scanner.nextLine()

热门文章

  1. C# WinForm GUI之WinForm基础
  2. 数据采集,网站批量自动采集数据
  3. Linux C语言 pthread_cond_wait()、pthread_cond_timedwait()函数(不允许cond被唤醒时产生竞争,所以需要和互斥锁搭配)
  4. android虚拟按键实现,虚拟按键的实现
  5. when I want to have a rest
  6. 从网友评论中思考成长性思维和固定性思维
  7. vue 使用fs_在vue里面使用iVew框架
  8. mysql怎么快速删除亿级数据_mysql数据库如何实现亿级数据快速清理
  9. 华三模拟器之OSPF实验
  10. Q6:QIA一站式测试