JDK8&9新特性
1|0接口的新特性
概述
增加内容
1|1默认方法
概述
语法格式:
使用规则:
影响:
代码示例:
1|2静态方法
概述:
使用:
结论
代码示例:
1|3私有方法
概述
使用
代码示例
1|4Lambda表达式
概述:
前提:【记住】
格式:【记住】
结论:
lambda表示式就是得到接口实现类对象的另一种方式【1、定义实现类创建对象 2、 匿名内部类 3、lambda表达式】
代码示例:
}
1|5Lambda表达式的省略原则
概述:
具体原则:
代码示例
1|6方法引用
概述:
特殊条件:
使用前提:
方法引用的格式:
代码示例:
1|7函数式接口
概述:
注解:
jdk内置常用函数式接口
1|8Consumer【消费性接口】
翻译过来就被称为消费者类型的接口。
那什么叫消费者类型呢?
消费者是啥,花钱的呗
给你一个东西,你就消费掉了
这就是消费型接口,所以抽象方法呢?猜都猜得出来了吧?来看看:
看到了吧,也是since1.8,并且也是FunctionalInterface,可以用Lambda的接口。抽象方法就是那一个accept。
accept就是接受一个泛型类型的参数,然后就,,就吃掉了,什么都不返回。
这不就是完美的消费者逻辑吗?所以就叫消费型接口。
至于下面那个andThen的默认方法,老哥都说过了,JDK的默认方法是1.8以后的新特性,现在先不管。
所以我们开始写Lambda表达式,创建几个Consumer对象试试:
这个方法属于Iterable接口,像是List,Set等等,都可以用这个方法。看入参,不就是需要你传入一个Consumer吗?然后你发现,他其实内部也很简单,就是内部手动给你for-each增强循环了一次,然后对于每一个元素都执行了Consumer的消费逻辑,至于逻辑是啥,我们自己规定,比如System.out.println每一个元素,就可以是我们的消费逻辑之一。
1|9Supplier【供给型接口】
待这消费型接口Consumer都说了,那我们就说说生产者类型接口Suppiler。
其实学了Consumer接口以后,这个Suppiler都没啥说的了。
消费者接口的抽象方法不是accept吗?给你一个泛型类型的对象【类型你自己指定】,然后就消费了,没有返回了。这就是消费型接口的抽象呗。确实,这也就是抽象的一种消费的理念。
那么生产呢?
很简单呗,猜都能猜出来,那不就是什么都不用给我,我给你搞个对象出来,对象类型你泛型指定,这不就是生产了?
来看看:
1|10Function【函数型接口】
这个类在java.util包下面,since 1.8也表示在JDK8以后才有这个玩意儿。Functional Interface也表示他只有一个抽象方法等待实现,可以用Lambda表达式——这个方法就是apply。
入参和出参类型,由我们用泛型动态指定。apply的具体逻辑就相当于是入参转化为出参的具体逻辑。也就相当于是y = f(x)这个里面的,映射法则f。具体逻辑需要我们用匿名内部类或者Lambda,写方法体来具体指定。
其实也就这个意思。这个接口,就代表一个y = f(x)的具体映射法则f的抽象。所以这个接口的名字也是非常的见名之意:Function,函数的意思
看出来了吗?
f1其实就是对于传入的String,获取长度的一个方法
f2其实就是对于传入的int数字加1的方法
f3其实就是对于传入的Object调用toString转化为字符串输出的方法
Java把这些映射规则,也就是y = f(x)中的【f】抽象成了这个Function接口的apply逻辑。然后x和y,自变量和因变量,也就是入参出参,Java使用了扩展性更强的泛型参数类型,而不是固定Object入参出参。因为固定Object的话还要涉及到类型转换,还有可能报ClassCast异常,很麻烦
Function接口,或者说下面的四大类函数式接口,在后面的Stream API中用的特别多,一定要掌握!
1|11Predicate【断言型接口】
功能
我们发现,他下面除了一些很多默认方法以外,只提供了一个抽象方法,test方法。这个方法就是传入一个参数,泛型类型自己制定,然后经过一段逻辑【这个由我们实现类指定,不管是匿名内部类还是Lambda都行】,最后返回true或者false的布尔值。
这不就是对于一个任意类型的入参,根据我们写的逻辑,然后进行一个判断返回true或者false的抽象吗?
那这个就叫对于一个元素的断言呗。给我一个元素,我给你断言到底你是真还是假。至于我判断的逻辑,交给本接口的实现类的书写即可,至于咋书写?匿名内部类或者Lambda呀。
匿名内部类语法对于这种单抽象方法的接口来说太low了,果断选Lambda表达式。
那么还是老样子,写几个实现类来看看:
1|12Stream流
- 概述
- 理解
- 作用:
- 注意:
Steam对象的获取:
Collection的Stream获取
Map的Stream的获取
数组的Stream获取:
代码示例:
结论:
集合:单列集合中的stream方法
数组:Stream接口中的静态方法of(T t)
Stream的方法
方法
代码示例:
// Object[] obj = s7.toArray();
//
// for (Object o : obj) {
// System.out.println(o);
// }}
方法总结
概述
详情
方法名 方法作用 方法种类 是否支持链式调用 count 统计个数 终结 否 forEach 逐一处理 终结 否 toArray 收集数据到数组 终结 否 collect 收集数据到指定集合 终结 否 filter 过滤 延迟方法 是 limit 取用前几个 延迟方法 是 skip 跳过前几个 延迟方法 是 concat 组合 延迟方法 是 map 映射 延迟方法 是
Stream综合案例
需求
代码示例
1|13注解
概述
概述
作用
常见注解
自定义注解
- 定义格式
- 注解的元注解
注解的属性
- 属性的作用
- 属性的格式
- 属性适用的数据类型
注解的解析
步骤:
代码示例
package com.tyhxzy.demo;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;public class TestGetValue {
public static void main(String[] args) throws Exception {
// 1、解析那个位置的注解 :获取解析的注解位置的对象 【反射对象】
Classclazz = TestPeople.class;
// 2、获取该位置的注解对象【反射对象 === 成员方法对象 Method类对象】
People annotation = clazz.getAnnotation(People.class);
// 3、注解对象调用对应的属性 【对应抽象方法】
int age = annotation.age();
String name = annotation.name();
int[] arr = annotation.arr();
System.out.println(name);// 金莲
System.out.println(age);// 25
System.out.println(Arrays.toString(arr));// 15 20}
注解练习
需求:
代码实现
使用注解
- 定义类在成员方法上使用Book注解并解析数据
}
注解的特殊属性value
当注解中只有一个属性且名称是value,在使用注解时给value属性赋值可以直接给属性值,无论value是单值元素还是数组类型。
如果注解中除了value属性还有其他属性,且至少有一个属性没有默认值,则在使用注解给属性赋值时,value属性名不能省略。
__EOF__
作 者:YXH
出 处:https://www.cnblogs.com/YxinHaaa/p/17459510.html
关于博主:编程路上的小学生,热爱技术,喜欢专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了