Lambda方法引用的概念

1).什么是“方法引用”:当我们使用Lambda实现一些功能时,发现已有的类库中已经有方法实现了这样的功能,这时,我们就可以引用已实现的方法来代替Lambda。(实际上就是将已有的方法传入了方法体,省略Lambda表达式)
2).常用的引用:
1).通过“对象”引用“普通成员方法”;
2).通过“类”引用“静态方法”;
3).引用“构造方法”;
4).通过“类”引用“普通成员方法”;

1. Lambda方法引用_对象引用成员方法

1).通过“对象”,引用它的“普通成员方法”:
2).示例代码:

/*通过"对象",引用成员方法.*/
//已有的类和方法。
class Student{public void show(){for (int i = 1; i <= 100 ; i++) {System.out.println("i = " + i);}}
}
public class Demo01 {public static void main(String[] args) {//1.制作一个线程,线程中打印1--100的所有的数字//使用Lambda的方式new Thread(()-> {for (int i = 1; i <= 100 ; i++) {System.out.println("i = " + i);}}).start();//这时,我们发现已有的Student类中的show()已经实现了这样的功能//我们就可以引用Student类的show()方法:格式:对象名::方法名Student stu = new Student();new Thread(stu::show).start();//实际上就是传入了show()方法。Thread内部就直接调用show()方法for (int k = 0; k < 100; k++) {System.out.println("k = " + k);}
//一个小练习
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("张三丰");
list.add("章子怡");
list.add("张无忌");
System.out.println("呵呵");//筛选出所有张姓学员,并打印-使用Lambda
list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));//此处使用了Lambda,功能:接收一个String,打印一个String
//我们发现现有类库中,有个方法也可以做一样的事:接收一个String,打印一个String
//System.out对象的println方法具有这样的功能。
//我们就可以引用这个方法
list.stream().filter(s -> s.startsWith("张")).forEach(System.out::println);//直接传入了println()方法。forEach内部也会直接调用println()方法。}
}

调用方法的发展:子类 --> 匿名内部类 --> Lambda --> 已有的方法(方法引用)

2. Lambda方法引用_类引用静态方法

1).通过“类名”,引用“静态方法”。
2).示例代码:

/*通过"类名",引用它的"静态方法"*/
//已有一个接口
interface IA{public int getMax(int a ,int b);}
public class Demo02 {public static void main(String[] args) {//现在调用calc()方法//1.传入Lambda--直接重写getMax(int a,int b)方法calc((a,b)-> {return a > b ? a : b;});//2.我们发现现有类库中,有个方法实现了这个功能:Math类的静态方法"max()"//由于是静态方法,我们就可以直接通过"类名"引用静态方法:格式:类名::方法名calc(Math::max);//实际传入的是Math类的max()方法,calc方法内部调用的也不是Lambda了,而是Math的max()方法}//已有的一个方法public static void calc(IA a){int max = a.getMax(10, 20);System.out.println("最大值:" + max);}
}

3. Lambda方法引用_构造器引用

1).引用某个类的“构造方法”;
2).示例代码:

//自定义猫类
class Cat{private String name;public Cat(String name){this.name = name;}@Overridepublic String toString() {return "我是一只小猫,我叫:{" +"name='" + name + '\'' +'}';}
}
//测试类
public class Demo03 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();//存储是猫的名字list.add("小花");list.add("小红");list.add("小翠");//将这个集合中的名字构造出对应的Cat对象,并打印list.stream().map(s -> new Cat(s))//将Stream<String> 转换为Stream<Cat>.forEach(cat -> System.out.println(cat));//我们看map(s -> new Cat(s)),功能:接收一个String,返回一个Cat对象//而Cat类的带参构造方法也实现这个功能。这时,我们就可以引用:Cat类的带参的构造方法list.stream().map(Cat::new)//引用Cat的String参数的构造方法,自动匹配Cat的String参数的构造方法.forEach(cat -> System.out.println(cat));}
}

4. Lambda方法引用_类引用成员方法【难点】

1).通过“类名”来引用它的“普通成员方法”。
2).示例代码:

//已有的一个接口
interface IA{public int findStr(String srcStr,String subStr);
}
//测试类
public class Demo04 {public static void main(String[] args) {//1.使用匿名内部类fun(new IA() {@Overridepublic int findStr(String srcStr, String subStr) {//找第二个参数在第一个参数中出现的位置int index = srcStr.indexOf(subStr);return index;}});//2.使用Lambdafun((srcStr, subStr) -> srcStr.indexOf(subStr));//也是:找第二个参数在第一个参数中出现的位置//当我们的Lambda表达式中,是调用第一个参数的某个方法,将第二个参数作为调用第一个参数的方法的实参//这时可以使用"第一个参数的类型名::这个类中被调用的方法名"的形式引用一个类的普通方法。fun(String::indexOf);}//已有的一个方法public static void fun(IA a){int index = a.findStr("我爱Java", "Java");//内部:"我爱Java".indexOf("Java")System.out.println("索引位置:" + index);}
}

jdk8新特性-Lambda表达式,方法引用相关推荐

  1. jdk8新特性 lambda表达式详解

    本文主要讲到的内容有: 一- 前言 二- 背景 三- lambda表达式的语法 四- Lambda程序例子 4-1 Runnable Lambda 4-2 Comparator Lambda 4-3 ...

  2. JDK8新特性(四)之方法引用

    一.方法引用的介绍 import java.util.function.Consumer;public class Demo {public static void getMax(int[] arr) ...

  3. JDK8新特性-Lambda表达式查找

    2019独角兽企业重金招聘Python工程师标准>>> 1. Lambda语法的三种形式 (参数) -> 单行语句 (参数) -> {多行语句} (参数) -> 表 ...

  4. java lambda表达式详解_Java8新特性Lambda表达式详解

    课程目标: 通过本课程的学习,详细掌握Java8新特性之Lambda表达式: 适用人群:有Java基础的开发人员: 课程概述:从Java 8出现以来lambda是最重要的特性之一,它可以让我们用简洁流 ...

  5. 函数式接口 lambda表达式 方法引用

    拉呱: 终于,学习jdk8的新特性了,初体验带给我的感觉真爽,代码精简的不行,可读性也很好,而且,spring5也是把jdk8的融入到血液里,总之一句话吧,说的打趣一点,学的时候自己难受,学完了写出来 ...

  6. JDK8新特性-Lambda

    JDK8新特性-Lambda 说明 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 L ...

  7. Java8新特性总结 - 4.方法引用

    所有示例代码打包下载 : 点击打开链接 Java8新特性 :  接口新增默认方法和静态方法 Optional类 Lambda表达式 方法引用 Stream API - 函数式操作流元素集合 Date/ ...

  8. Java 8 新特性 lambda表达式

    / Created by Manager on 2021/4/1. Java 8 新特性 lambda表达式 StreamAPI 新日期 新注解 */ 视频连接 1https://www.bilibi ...

  9. Java8新特性----Lambda表达式详细探讨

    Java8新特性 Lambda表达式 入门演示 案例1 如何解决 cannot be cast to java.lang.Comparable问题? 案例2 优化方式一 : 策略设计模式 优化方式二: ...

最新文章

  1. k8s概念入门之kube-proxy-针对1.1版本阅读
  2. 30+的程序猿,路在何方?
  3. 【转】基本概念:过拟合、修剪、假正、假负
  4. [leetcode]从中序与后序/前序遍历序列构造二叉树
  5. 被阿里P8面了两个小时,技术、业务有来有回......
  6. Redux 主要知识学习总结
  7. 转浅谈缓存击穿、缓存并发和缓存失效
  8. 实施ERP系统的一般方法和步骤
  9. cmd 登录oracle
  10. STC学习:非易失存储器
  11. 高并发架构系列:最全消息队列有哪些?详解消息队列的选型与应用
  12. 软件项目管理 案例教程复习要点
  13. 新概念51单片机c语言教程doc,新概念51单片机C语言教程实例代码.doc
  14. java jsp 文件上传_JSP实现快速上传文件的方法
  15. Flash 第十一章 引导层和遮罩层动画
  16. 互联网大佬生存法则 如何防守周鸿祎
  17. java将日期转换成大写_将util.Date转换为大写(农历)时间
  18. littleVGL开发(8):消息弹窗控件(lv_mbox)
  19. mtk8788 pwm频率及背光亮度调节
  20. 辅助知识-第2 章 项目合同管理

热门文章

  1. 多邻国学英语 tips
  2. 一篇文章带你玩转C语言基础语法5:条件判断 if else 语句与分支 。(千字总结)
  3. 大数据学习零基础能够学会不?
  4. java excel 饼图_Java 在 Excel 中创建饼图/环形图
  5. MDK keil中在定义一个结构体的时候加点后面不出现结构体当中变量的提示
  6. 基于java jsp的健身房会员卡管理系统ssh框架
  7. antv g6多次渲染问题解决
  8. 塑造棋牌游戏文化内涵
  9. 初识动态规划(一)简单入门动态规划与上手操作
  10. MTK: LSK,RSK的标签与响应