JavaSE学习18(接口组成更新,方法引用)
接口组成更新
1.1 接口组成更新概述
接口的组成常量: public static final 可省略抽象方法: public abstract 可省略
java8之后 加入了默认方法:静态方法:
java9之后 加入了私有方法:
1.2 接口中的默认方法
接口中默认方法的定义格式public default 返回值类型 方法名(参数列表){ } public可省略
范例:default void show3(){ }接口中默认方法的注意事项:默认方法不是抽象方法,所以不强制被重写。但是也可以重写 重写时去掉default关键字public可以省略 default不能省略
1.3 接口中的静态方法
接口中的静态方法的定义格式:格式: public static 返回值类型 方法名(参数列表){ } public可以省略范例: static void show() { }
接口中静态方法的注意事项:静态方法只能通过接口名调用,不能通过实现类名或者对象名调用public可以省略 static不能省略
1.4 接口中私有方法
java9中新增了带方法体的私有方法,这其实在java8中就埋下了伏笔: java8允许在接口中定义带方法体的
默认方法和静态方法。这样就肯能会引发一个问题: 当两个默认方法或者静态方法中包含同一段相同的代码实现时,
程序必然考虑将这段实现代码抽取成一个共性方法,而这个共性方法是不需要让别人使用的,因此私有给隐藏起来,
这就是java9增加私有方法的必然性
接口中私有方法的定义格式:格式1: private 返回值类型 方法名(参数列表){ }范例: private void show() { }格式2: private static 返回值类型 方法名(参数列表) { }范例: private static void method() { }
接口中私有方法的注意事项:默认方法可以调用私有的静态方法和非静态方法静态方法只能调用私有的静态方法
2 方法引用
2.1 体验方法引用
在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案: 拿参数做操作
考虑一种情况: 如果我们在Lambda中指定的操作方案,已经有的地方存在相同的方案,还有必要写重复的逻辑吗?
使用已经存在的方案,就是 方法引用
public class PrintableDemo{public static void main(String[] args){usePrintable(s -> System.out.println(s));usePrintable(System.out::println);}private static void usePrintable(Printable p){p.printString("爱生活,爱java");}
}
2.2 方法引用符
方法引用符: :: 该符号位引用运算符,而它所在的表达式被称为方法引用
回顾在体验方法引用中的代码Lambda表达式: usePrintable(s -> System.out.println(s));分析: 拿到参数s之后通过Lambda表达式,传递给System.out.println 方法去处理方法引用: usePrintable(System.out::println);分析: 直接使用System.out中的println方法来取代Lambda,代码更加简洁
推导和省略如果使用Lambda,那么根据 可推导就是可省略 的原则,无需指定参数类型,也无需指定重载形式,他们都将被自动推导如果使用方法引用,也是同样可以根据上下文进行推导方法引用是Lambda的孪生兄弟
2.3 Lambda表达式支持的方法引用
常见的引用方式:引用类方法:引用对象的实例方法引用类的实例方法引用构造器
2.4 引用类方法
引用类方法,其实就是引用类的静态方法
格式: 类名::静态方法
范例: Integer::parseIntInteger类的方法: public static int parseInt(String s) 将此String转换为int类型数据
练习:public class ConverterDemo {public static void main(String[] args) {//Lambda表达式useConverter(s -> Integer.parseInt(s));//引用类方法useConverter(Integer::parseInt);//Lambda表达式被类方法替代的时候,它的形式参数全部传递给静态方法作为参数}private static void useConverter(Converter c){int num = c.converter("1998");System.out.println(num);}}public interface Converter {int converter(String s);}
2.5 引用对象的实例方法
引用对象的实例方法,其实就是引用类中的成员方法
格式: 对象::成员方法
范例: "HelloWorld"::toUpperCase
String类中的方法: public String toUpperCase 将此String所有的字符转换成大写
练习:public class PrinterDemo {public static void main(String[] args) {//用Lambda表达式实现usePrinter(s -> System.out.println(s.toUpperCase()) );//引用对象的实例方法PrintString ps = new PrintString();usePrinter(ps::PrintUpper);//Lambda表达式 被对象的实例方法替代的时候,它的形式参数全部传递给该方法作为参数}private static void usePrinter(Printer p){p.printUpperCase("HelloWorld");}}public class PrintString {public void PrintUpper(String s) {String result = s.toUpperCase();System.out.println(result);}}public interface Printer {void printUpperCase(String s);}
2.6 引用类的实例方法
引用类的实例方法,其实就是引用类的成员方法
格式: 类名::成员方法
范例: String::substring
String类中的方法: public String substring(int begin,int end)
从begin开始到end结束 截取字符串,返回一个字串,字串的长度位end-begin
练习:public class MyStringDemo {public static void main(String[] args) {//Lambda表达式 调用String类中的substring来实现useMyString((s,x,y) -> s.substring(x,y));//引用类中的实例方法useMyString(String::substring);//Lambda表达式被类的实例方法替代的时候//第一个参数作为调用者//后面的参数全部传递给该方法作为参数}private static void useMyString(MyString my){String s = my.mysubString("HelloWorld",2,5);System.out.println(s);}}public interface MyString {String mysubString(String s,int x,int y);}
2.7 引用构造器
引用构造器,其实就是引用构造方法
格式: 类名::new
范例: Student::new
练习:public class StudentDemo {public static void main(String[] args) {//Lambda表达式useStudentBuilder((name,age) -> new Student(name,age) );//方法引用 引用构造器useStudentBuilder(Student::new);//Lambda表达式被构造器替代的时候,它的形式参数全部传递给构造器作为参数}private static void useStudentBuilder(StudentBuilder sb){Student s = sb.build("fzz", 21);System.out.println(s.getName()+","+s.getAge());}}省略Student类 一个name,一个age,两个构造(无参、带参),成员各自的get,setpublic interface StudentBuilder {Student build(String name,int age);}
JavaSE学习18(接口组成更新,方法引用)相关推荐
- 十三、Java高级特性 Lambda表达式 | 接口组成更新 | 方法引用 | 函数式接口
文章目录 十三.Java高级特性 1.Lambda表达式 1.1体验Lambda表达式[理解] 1.2Lambda表达式的标准格式[理解] 1.3Lambda表达式练习1[应用] 1.4Lambda表 ...
- Lambda表达式接口更新方法引用函数式接口Stream流
Lambda表达式&接口更新&方法引用&函数式接口&Stream流 Lambda 1.程序启动三种不同的表现形式 2.Lambda表达式的标准格式 3.练习 Lambd ...
- JavaSE学习笔记(持续更新)
这里写目录标题 JavaSE学习笔记(持续更新) Java跨平台原理与核心机制 1.跨平台原理: 2.两种核心机制: JDK11的安装流程 Java程序开发的三个步骤(无编辑器版) Eclipse安装 ...
- 学习笔记之-java8的新特性-函数式接口,lambda表达式,方法引用,Stream API,Optional类
1.Lambda表达式 用匿名内部类的方法去创建多线程1.new Thread2.参数传递new Runnable3.重写run方法4.在run方法中去设置线程任务5.调用start问题:我们最终目标 ...
- 函数式接口 lambda表达式 方法引用
拉呱: 终于,学习jdk8的新特性了,初体验带给我的感觉真爽,代码精简的不行,可读性也很好,而且,spring5也是把jdk8的融入到血液里,总之一句话吧,说的打趣一点,学的时候自己难受,学完了写出来 ...
- 15.方法引用, Stream流,File类 , 递归 ,字节流
JavaSE高级 Lambda表达式.方法引用.Stream流.File类 第一章 JDK8新特性 JDK新特性: Lambda 表达式 默认方法[已学习过] Stream API 方法引用 Base ...
- Java 8 中的方法引用,轻松减少代码量,提升可读性!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 1. 引言 Java8中最受广大开发中喜欢的变化之一是因为 ...
- java(九)-方法引用, Stream流,File类 , 递归 ,字节流
day09[方法引用.Lambda表达式.Stream流] 今日目标 线程状态 等待与唤醒 Lambda表达式 Stream流 教学目标 能够说出线程6个状态的名称 能够理解等待唤醒案例 能够掌握La ...
- Java 8 - 05 方法引用
文章目录 Pre 方法引用 如何构建方法引用 指向静态方法的方法引用 指向任意类型实例方法的方法引用 指向现有对象的实例方法的方法引用 构造函数引用 自定义构造函数引用 Pre 先来看段代码 Comp ...
最新文章
- blktrace 工具集使用 及其实现原理
- 【转载+软件实际操作 OpenHW12参赛手记】ZedBoard-裸机下运行Hello,World【常见错误解决方案】++...
- lisp的vla函数画矩形_python之:tkinter画哆啦A梦
- Elasticsearch学习之快速入门案例
- Angular CLI ng 指令指南
- tt公路车Java配置怎么样_普通公路车换TT车把可以吗,别的东西还有需要换的吗?...
- r语言导入ggplot2_R语言教程:数据结构+导入数据!
- 苹果AirPods Max拼多多百亿补贴价来了:券后价3999元
- C++编程实现单链表的逆置
- putty和WinSCP后门检查及清理方式
- 【东软实训】SQL函数
- 连载三:RobotFramework+Selenium+Jenkins分布式构建
- 哪个计算机无法做到双屏显示,[工具/ PC]如何在计算机上实现双屏显示?
- Axios中无法运行 json-server【已解决】
- 聚焦改变字体,背景颜色
- 机器学习- 吴恩达Andrew Ng Week1 知识总结 Introduciton
- 正点原子STM32F103(精英版)------串行通信
- 基于Spark的电影推荐系统实现
- 国内外优秀的计算机视觉团队汇总|最新版
- 图像处理之K-Means算法演示
热门文章
- permit doing 与permit to do详细区别
- 陪审团问题_Oraclevs谷歌–陪审团僵局? 部分裁决? str?
- SecureCRT 设置黑底白字和编码
- jvm原理解析--不疯魔不成活
- 旗舰版ndows7bios设置,戴尔成铭 3988台式机装win7系统的方法(intel 9代BIOS设置方法和USB驱动)...
- 微信支付获取prepay_id以及回调地址
- 阿里云启动视频云V5计划,全面赋能生态合作伙伴
- 鸿蒙os商用版,鸿蒙OS再次官宣最快今年9月商用,可以一夜之间代替安卓系统
- 关于C#英文注释改成中文注释
- linux aeon gcc,在rosettaCM中,一些操作所需要的linux命令