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

发布了29 篇原创文章 · 获赞 9 · 访问量 818

猜你喜欢

转载自blog.csdn.net/qq_41488299/article/details/105060515