JDK新特性文字版
接口
在jdk1.8前
- 常量和抽象方法
- 成员都是公共的,修饰也是固定的
- 实现类必须实现所有抽象方法,否则还是抽象方法
在jdk1.8后
-
允许有带有方法体和方法
-
默认方法
-
default修饰
- 1、实现类可重写,也可不重写
- 2、实现类中可以直接调用默认方法
- 3、重写了默认方法,调用接口中的默认方法,接口名.super.默认方法名()
- 4、实现类实现了多个接口,接口中有相同的方法定义,实现类必须重写该方法
- 5.一个类继承了一个父类并实现了接口,父类和父接口中有相同的默认方法,优先找类
这样定义接口,发现接口与抽象类越来越像,因此接口有要替代抽象类的趋势。
因此类和类是继承,耦合度高,接口和类是实现关系,耦合度要低。
-
-
静态方法
-
static修饰
- 接口名.静态方法名
- 静态方法不被实现类实现,因此实现类不能调用
- 静态方法只能访问静态,非静态即可以访问静态也可以访问非静态
-
jdk9.0
- 接口中可有私有方法
- 只能在接口内部使用,外部其他类不能使用
Lambda表达式
概念
- Lambda表达式最终也会有一个值。实际就是一个匿名实现类的对象,也就是匿名内部类的简写格式,也可以当做一个数据直接进行传递。
好处
- 代码简洁,效率高(不会有对应的class文件去创建)
前提
-
接口是一个函数式接口,即接口中只有一个抽象方法,(默认方法和静态方法不考虑)
-
判断是否是函数式接口,在接口上方添加注解
- @FunctionalInterface
格式
-
(参数列表) -> {方法体语句;};
-
{参数列表}:接口中的抽象方法的参数列表
-
->
- Lambda表达式的固定符号
-
{方法体语句;};
- 接口中抽象方法的具体实现代码
案例
-
方法无参数,无返回值
- Runnable run = () -> System.out.println("run");
-
方法有参数,无返回值
- Consumer
con = (String s) -> System.out.println(s.length());
con.accept("123"); - Consumer
con = s -> System.out.println(s.length()); - 说明:箭头左侧,参数列表的类型和小括号可以省略
前提是只有能有一个参数
- Consumer
-
有返回值,无参数
- Callable
call = () -> {return "hello";}; - Callable
call = () -> "hello"; - 说明:箭头右边,有且只有一行,可以省略大括号
这一行中有return,那么就将return和大括号一起省略。
- Callable
-
有返回值,有参数
- Comparator
com = (Integer i1,Integer i2) -> Integer.compare(i1,i2); - Comparator
com = (i1,i2) -> Integer.compare(i1,i2); - 说明:箭头左侧,参数列表的类型可以省略
- Comparator
总结
- 左右各为一时,可以省略对应括号
- 左侧的参数类型可以省略,注没有小括号不能省略
- 右侧语句大于等于2的时不能省略大括号
- 有return,并只有一条语句,那么return和大括号一起省略
函数式接口
核心函数式接口
- java.util.function包
消费型接口
-
Consumer
- void accept(T t):对t进行处理操作,操作完成后就结束
-
打印字符串长度
- Consumer
consumer = s -> System.out.println(s.length); - consumer.accept("123131");
- Consumer
函数型(功能型)接口
-
Function<T,R>
- R apply(T t):对t进行各种计算,最终得到一个R类型的结果
-
将字符字符串转成小写
- Function<String,String> fun = s -> s.toLowerCase();
- System.out,println(fun.apply("QFFAAD"));
断言型接口
-
Predicate
- boolean test(T t):对t进行各种判断,最终得到一个boolean类型的结果
-
判断字符串长度是否大于5
- Predicate
pre = s -> s.length() > 5; - System.out.println(pre.test("2313123"));
- Predicate
供给型接口
-
Supplier
- T get():返回T类型数据
-
返回字符串abc
- Supplier
sup = () -> "abc"; - System.out.println(sup.get());
- Supplier
方法引用
Lambda表达式的简写格式
格式
-
对象名 :: 实例方法名
- Consumer
con = s -> System.out.println(s); - Consumer
con1 = System.out::println; - con.accept("123");
- con1.accept("123");
- Consumer
-
类名 :: 静态方法名
- Comparator
com = (x, y) -> Integer.compare(x,y); - Comparator
com1 = Integer::compare; - System.out.println(com.compare(1,5));
- System.out.println(com1.compare(1,5));
- 特点:接口中方法的参数列表和返回值类型 与 引用方法的参数列表和返回值相同。
- Comparator
-
类名 :: 实例方法名
- BiPredicate<String,String> bip = (s1,s2) -> s1.startsWith(s2);
-
BiPredicate<String,String> bip1 = String::startsWith; -
System.out.println(bip.test("abc","a")); -
System.out.println(bip1.test("abc","a")); - 特点:接口中方法的参数列表中的参数,第一个作为引用方法的调用者的第二个作为引用方法的参数。
-
构造引用
-
类名 :: new
- Supplier
sup = () -> new Person(); -
Supplier<Person> sup1 = Person :: new; -
System.out.println(sup1.get()); - 特点:接口中方法的参数列表要与构造方法的参数列表一致
- Supplier
-
-
数组引用
-
元素类型[] :: new
- Function<Integer,Character[]> fun2 = x -> new Character[x];
- Function<Integer,Character[]> fun3 = Character[] :: new;
- System.out.println(fun3.apply(5).length);
-
StreamAPI
作用:可以对数据源进行想要的计算,比如:过滤、去重复..,最终返回的是一个新的Stream。
特点
- 1、不改变数据源,得到新的Stream
- 2、可以对数据源及逆行一系列流水线似的操作
- 3、是一个惰性求值,只有看到终止命令才进行一系列的流水线计算
- 4、数据源是:数据或集合
- 5、数据源是存储数据的,而Stream是用来做计算的
- 6、Stream一旦执行了终止操作,Stream不可以再使用
步骤
-
1、获取Stream对象
-
2、一系列流水线似的操作(方法)
-
3、终止操作
-
注
- 可以无第二步
- 无第三步,不做计算
获取Stream对象
- java.util.stream包
- Collection.stream()
- Arrays.stream()
- Stream.of()
- Map.keySet().stream()
- Map.values().stream()
- Map.entrySet().stream()
中间操作
-
filter(Predicate):过滤
- 获取到Stream对象,相当于有了数据源中的所有数据,每个数据会进行filter计算
符合就要,不符合不要,因此得到的新的Stream中存储的就是满足要求的数据
- 获取到Stream对象,相当于有了数据源中的所有数据,每个数据会进行filter计算
-
distinct():去重
-
map(Function):对数据运行function的计算操作
-
limit(int num)
- 限制结果集个数,从开始到指定
-
skip(int num)
- 从num-末尾个处理,
跳过至指定条数
- 从num-末尾个处理,
-
sorted()
- 排序,按自然顺序
-
sorted(比较器)
- 按照比较器顺序
终止方法
-
forEach(Consumer)
-
count()
- 统计个数
-
collect(Collctor)
- 收集

浙公网安备 33010602011771号