jdk8新特性(接口新特性、lambda表达式、方法引用、函数式接口、Stream流)和单例设计模式
1.单例设计模式
1.概念:
设计模式:使用固有的流程或方式设计出来的类接口、枚举等元素
2.设计原则:
1.私有化构造方法【private、protected】
2.类中创建最终对象【唯一不能被赋值】
3.给外界提供公有的访问对象的方式
3.分类:
饿汉式:
1.概述:对着类的加载及时的创建对象的一种单例模式
2.特点:对象及时的创建,占用内存空间
老汉式:饿汉式变形式
1.概述:是饿汉式的一种【饿汉式变形】
2.特点:在饿汉式的基础上,省略了对外界提供的方法,公开化声明的变量,创建对象赋值给变量同时使用final修饰
懒汉式:
1.概述:类加载的时候只声明对象变量,不给它赋值,什么时候用对象的时候才创建对象。保证只创建一次
2.特点:对象需要使用的时候才创建,不提前占用内存。
2.jdk8接口新特性
1.概述:
1.java8中的接口,不仅可以定义抽象方法,也允许定义非抽象方法。
2.抽象方法的定义方式和以前一样,默认加上了public abstract ,不能拥有方法体。
3.非抽象方法是指拥有方法体的方法,普通方法接口不允许的,增加默认方法和静态方法。
2.默认方法:
1.使用原因:
1.8中很多老接口中,增加了很多新的方法,这样就会让原来的旧项目无法编译通过,因此为了向下兼容,新增的方法,就加上了默认实现,但是这种方法不会被强制要求实现类重写。
2.使用规则:
1.加上default的,实现类可以重写也可以不重写直接调用
2.特殊情况1:实现类实现了多个接口,如果又相同的抽象方法声明,则强制要求在实现类中,必须重写这个方法。
3.特殊情况2:在特殊情况1中,如果实现类重写这个方法的过程中,希望调用其中某个接口的默认方法时。则可以使用格式:接口名.super.默认方法名称()进行调用
4.特殊情况3:实现类继承了一个父类,并且实现了一个接口,并且在父类中和接口中,有相同的方法声明,则“类优先”。即使用类的实现,即使继承的是一个抽象类,也是使用父类的实现(即强制重写)
5.特殊情况4:实现类实现了多个接口,如果不同的接口中抽象方法和默认方法有相同的方法声明;实现类必须进行重写该方法声明。
3.产生影响:
1.接口中如果也可以定义非抽象方法,那么和抽象类的差别就会越来越小
2.java中一个类只能继承一个抽象类,但是可以实现多个接口
3.所以有了默认方法,就会让大量的抽象类变成接口,即弱化了抽象类
3.静态方法:
1.接口中的静态方法可以定义方法体内容。
2.static不能和abstract共存
3.外界只能通过接口名称。静态方法名来访问接口静态方法,实现类中不会继承接口中的静态方法,原因:如果一个类同时实现了多个接口,接口中具有相同的静态方法,实现之后不知道应该以那个为准进行调用使用。
总结:接口的静态方法只属于接口自己,不能被实现类实现,只能使用接口名来调用
3.lambda表达式:【函数表达式】
**1.概述:**就是一个数学的方程式,函数表达式就是一个值的式子,是一个数值。概述:lambda是函数式接口的子类对象。它是匿名内部类的变形形式
2.使用:具有自己的固定格式
3.标准格式:
(参数列表)->{表达式做事的逻辑代码}
4.格式元素说明:
三个一:一些参数 一个箭头 一段代码
(参数列表):lambda表达式需要的资源【花括号中做事需要的数据】;;就是匿名内部类重写抽象方法的方法参数列表【原封不动拿过来】
->:它是lambda的标识
{代码}:表达式做事的逻辑代码【就是匿名内部类中重写的那个方法的方法体】
5.格式可以省略:
小括号省略原则:
1.参数类型直接省略【有上下文推断】
2.如果参数有且只有一个参数,类型和小括号都可以省略
3.无参的时候,小括号不能省略
大括号省略原则:
有且只有一条语句:可以同时省略return、大括号、分号
注意事项:
1.三者要省略同时全部省略,不能单一省略。
整体注意事项:小括号和大括号的省略原则互不干涉
6.匿名内部类的使用前提:(拥有继承或者实现关系)
1.本质:父类或父接口的子类或实现类对象
lambda的使用前提:
1.有且只有一个抽象方法的接口【函数式接口】
2.使用必须要有上下文推断
注意:
1.使用匿名内部类创建接口的对象的时候,会单独编译成为一个字节码文件,意味着对应的是一个对象【在堆空间中开辟对象空间了】占用空间,执行效率低。
2lambda表达式变形之后没有单独编译成文件,意味着它没有对应的类【可以当作不是一个对象】,在内存中使用了一个数值来表示接口的实现类对象这样不用单独的开辟空间,节约了内存空间,相对执行效率提升了
7.总结:
1.lambda表达式是匿名内部类的变形,表示一个函数接口的对象
2.lambda表达式的小括号就是抽象方法的参数列表,大括号就是抽象方法重写后的
方法体:
3.lambda表达式的大括号需要出效果,必须要使用lambda进行调用对应的方法
4.方法引用【lambda的孪生兄弟】
1.概述:
lambda表达式的执行体【大括号】里面的代码如果已经被另一个类中的某个方法完成过,就直接把这个类的方法引用过来使用,就不重新书写了
2.格式:
【::】符号就是方法引用的标识
普通方法:对象::方法名。比如:System.out::print
静态方法:类名::方法名 比如:Math::abs
构造方法:类名::new
3.作用:
1.可以把一个类中已有的方法调用作为函数式的具体体现来使用,提升了代码的复用性
2.可以把一个类中已有的方法调用作为函数式的具体体现来使用,直接将方法作为值来传递
4.本质:
代表接口的实现类对象【实际是值】
5.函数式接口
1.概述:
有且只有一个抽象方法的接口就叫做函数式接口。比如:Runnable
2.注解:@Functionallnterface
3.作用:
接口上写上这个注解,编译的时候jvm就会自动的判断所在接口是不是函数式接口。是编译通过,不是编译不通过报错了。主要使用于函数式接口的定义
4.常见内置函数式接口:
概述:jdk1.8之后的API中提供的函数式接口,我们直接使用lambda表达式使用
1.消费型接口【Consumer】
1.抽象方法:
void accept(T t):给我一个数据我能消费掉
2.作用:
1.当某个函数【函数式接口的抽象方法】可以接收一个数据,并且处理这个数据,处理完成之后,不需要返回任何数据,这个函数需要当做数据来进行传递,就是用消费型接口
2.以前只能传递要处理的数据,现在也可以传递处理数据的方式。
2.供给型接口【Supplier】
1.名称:供给型接口【无中生有】
2.抽象方法:T get()
3.作用:
可以产生任意一个需要的数据,当作数据来进行传递
3函数式接口【Function<T,R>】转换型接口
1.抽象方法:R apply(T t)
2.作用:把一个资源转换成另外一个资源
3.默认功能:
addThen(Function f):连接两次数据转换的功能,先按照第一个接口的转换方式转换然后再按照第二个接口的方式继续转换
4.断言型接口【predicate:判断型接口】
1.抽象方法:boolean test(T t)
2.作用:
接受一个数据,判断数据是否合法【判断标准自己重写,返回一个Boolean结果】
默认方法:
predicate and(Predicate pre):两个接口判断后的结果按照且的关系进一步判断整合
predicate or(Predicate pre):两个接口判断后的结果按照或的关系进一步判断整合
predicate negate():返回的是调用者判断条件的取反
6.Stream流
1.获取对象的方式:
1.Colleciton获取stream对象的方式
集合对象.stream():把集合对象转换未stream流对象
2.Map的获取stream对象:(不能直接获取)
1.把双列集合转变为单列集合,采用单列集合转换stream流方式操作
2.双列集合转换为单列集合的方式
1.KeySet():得到的是key的set集合
2.entrySet():得到的是集合
3.values():得到的是value的集合
3.数组的获取方式:
采用stream接口中的静态方法:Stream.of(数组对象)
2.Stream中的常用方法:
1.终结方法:(stream调用该方法后返回的数据类型不是Stream对象的方法)
1.foreach():打印stream中容器数据
2.count():获取stream中的数据个数
3.toArray():把stream处理后的数据取出到数组中
4.collect(Collector c):把stream中的数据取出放到集合中
**2.延迟方法:**就是stream调用该方法后返回的数据类型还是stream对象的方法
1.filter(Perdicate p):过滤容器数据的
2.limit(long num):截取stream操作数据的前num个元素
3.skip(long num):跳过开头的前num个元素
4.map(Function f):把stream中的数据转换成其他数据
5.concat(Stream stream):拼接两个stream成为一个stream
jdk8新特性(接口新特性、lambda表达式、方法引用、函数式接口、Stream流)和单例设计模式相关推荐
- 函数式接口 lambda表达式 方法引用
拉呱: 终于,学习jdk8的新特性了,初体验带给我的感觉真爽,代码精简的不行,可读性也很好,而且,spring5也是把jdk8的融入到血液里,总之一句话吧,说的打趣一点,学的时候自己难受,学完了写出来 ...
- Lambda表达式接口更新方法引用函数式接口Stream流
Lambda表达式&接口更新&方法引用&函数式接口&Stream流 Lambda 1.程序启动三种不同的表现形式 2.Lambda表达式的标准格式 3.练习 Lambd ...
- 学习笔记之-java8的新特性-函数式接口,lambda表达式,方法引用,Stream API,Optional类
1.Lambda表达式 用匿名内部类的方法去创建多线程1.new Thread2.参数传递new Runnable3.重写run方法4.在run方法中去设置线程任务5.调用start问题:我们最终目标 ...
- 十三、Java高级特性 Lambda表达式 | 接口组成更新 | 方法引用 | 函数式接口
文章目录 十三.Java高级特性 1.Lambda表达式 1.1体验Lambda表达式[理解] 1.2Lambda表达式的标准格式[理解] 1.3Lambda表达式练习1[应用] 1.4Lambda表 ...
- 三、jdk1.8新特新Lambda表达式方法引用
前言 在之前我们接触了JDK1.8引入的新特新lambda表达式没在某种程度上,它可以简化我们的代码,帮助我们快速的编写代码,但在这其中我们之前的编写方式并不是lambda表达式最简洁的方式,而在头屑 ...
- Lambda表达式-常见的函数式接口
目录 一.Runnable / Callable接口 二.Supplier 三.Consumer 四.Comparator 五.Predicate 六.Function 一.Runnable / Ca ...
- Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)
目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行 Stream的.max方 ...
- Java8新特性(一)-Lambda表达式
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/hhq12/article/detail ...
- jdk8新特性(Lambda、Steam、函数式接口)
JDK8新特性 JDK8新特性 Lambda表达式 函数式(Functional)接口 方法引用与构造器引用 方法引用 构造器引用 强大的 StreamAPI 创建Stream方式 Stream 的中 ...
最新文章
- 搭建hbase1.2.5完全分布式集群
- 异构GoldenGate 12c 双向复制配置
- matlab cam orbit,如何在MATLAB中平滑旋转3D绘图?
- mysql gbk支持_mysql支持gbk
- python归并排序 分词_python-归并排序
- input python2.7_python 中的input
- 为什么剩余数不能相加_为什么各位之和是 3 的倍数的数能被 3 整除?
- NLP中的Mask全解
- juniper srx解决内网不能telnet公网IP的方法
- Eclipse 打开文件出现乱码情况总结
- 前端学习(556):margin与容器的尺寸
- Nginx根据路径设置静态资源
- 用倍增方式查询本表数据再插入到本表,用作测试数据
- JavaScript截断/切片/修剪掉字符串中的最后一个字符
- 银行卡四要素认证api接口_银行卡实名认证查询-银行卡四要素鉴权
- 华旭 身份证读卡器测试软件_华旭身份证读卡器阅读软件8.0版本 支持免驱
- excel怎么启用宏_怎么使用Excel制作条形码?操作如此简单
- uefi+gpt分区修复esp引导
- html存储数据的方法,数据存储方式有哪些
- 基于FPGA的双通道DDS信号发生器
热门文章
- [SHOI2009] 会场预约
- 今天开始记录我的开发生涯
- MaciOS之多线程(转)
- C++/CLI学习入门数组
- 10分钟搭建商品结算平台!商品、车辆识别一网打尽
- 9行代码提高少样本学习泛化能力! ICLR2021 Oral,代码已开源
- CV+NLP,使用tf.Keras构建图像搜索引擎
- 重磅!总奖池536万,首届“全国人工智能大赛”(AI+4K HDR 视频 与 行人重识别)...
- 神操作!傅里叶变换取代Transformer自注意力层
- 清华 | 量化卷积神经网络加速芯片