1.default关键字
在jdk8之前,接口里面只能包含抽象方法,但是jdk8之后,允许使用default修饰的默认方法。
public interface NewCharacter {
public void test1();
public default void test2(){
System.out.println("我是新特性1");
}
}
default作用
所以说这个default方法是所有的实现类都不需要去实现的就可以直接调用,那么比如说jdk的集合List里面增加了一个sort方法,那么如果定义为一个抽象方法,其所有的实现类arrayList,LinkedList等都需要对其添加实现,那么现在用default定义一个默认的方法之后,其实现类可以直接使用这个方法了,这样不管是开发还是维护项目,都会大大简化代码量。
public class NewCharacterImpl implements NewCharacter{
@Override
public void test1() {
}
public static void main(String[] args) {
NewCharacter nca = new NewCharacterImpl();
nca.test2();
}
}
2.lambda表达式
- jdk8开始引用的新的语法格式
- 作用:简化匿名内部类的代码写法
lambda表达式的简化格式:
(匿名内部类被重写方法的形参列表)->{
被重写方法的方法体代码。
}
//ps:->是语法形式,无实际含义
- lambda表达式只能简化函数式接口的匿名内部类的写法形式
ClassName :: methodName
jdk1.8提供了另外一种调用方式::,当 你 需 要使用 方 法 引用时 , 目 标引用 放 在 分隔符::前 ,方法 的 名 称放在 后 面 ,即ClassName :: methodName 。例如 ,Apple::getWeight就是引用了Apple类中定义的方法getWeight。请记住,不需要括号,因为你没有实际调用这个方法。方法引用就是Lambda表达式(Apple a) -> a.getWeight()的快捷写法,如下示例。
lambda的好处
lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,它可以写出更简介、更灵活的代码,作为一种更紧凑的代码风格,使Java语言表达能力得到了提升
lambda表达式的省略规则
- 参数类型可以省略不写
- 如果只有一个参数,参数类型可以省略,同时()也可以省略
- 如果lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号
- 如果lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时必须省略“;”
3.什么是函数式接口
- 首先必须是接口、其次接口中仅有一个抽象方法的形式
- @FunctionalInterface//一旦加上这个注释必须为函数式接口,且只有一个抽象方法
流
Stream流
- 在Java8 中,得益于Lambda所带来的函数式编程,引入 了一个全新的Stream流概念
- 目的:用于简化集合和数组操作的API
Stream流思想的核心:
- 先得到集合或者数组的Stream流(就是一根传送带)
- 把元素放上去
- 然后用这个Stream流简化的Api来方便元素操作
Stream流的三类方法
- 获取Stream流
-
- 创建一条流水线,并把数据放到流水线上准备进行操作
- 中间方法
-
- 流水线上的操作。一次操作完毕之后,还可以继续进行其他操作
- 终结方法
-
- 一个Stream流只有一个终结方法,是流水线上的最后一个操作
获取Stream流
- 集合获取Stream流的方式
- 可以使用Collection接口中默认方法stream()生成流
- 数组获取Stream流的方式
//集合数据流
Collection<String> list=new ArrayList<>();
Stream<String> stream = list.stream();
//map
Map<String,Integer> map=new HashMap<>();
//键流
Stream<String> stream1 = map.keySet().stream();
//值流
Stream<Integer> stream2 = map.values().stream();
//键值对流
Stream<Map.Entry<String, Integer>> stream3 = map.entrySet().stream();
//数组
String[] name={"dasf","dfa","dfa"};
//public static <T> Stream<T> stream(T[] array)
Stream<String> stream4 = Arrays.stream(name);
//public static<T> Stream<T> of(T... values) {
Stream<String> stream5 = Stream.of(name);
Stream流的常用API(中间方法)
注意:
- 中间方法也称非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。
- 在Stream流中无法直接修改集合、数组的数据
案例api-lambda-app-----d13-demo
Stream流的收集操作
- 收集Stream流的含义:就是把Stream流操作后的结果数据传回到集合或者数组中去。(Stream流:方便操作集合/数组的手段)
- 集合/数组才是开发目的。
Stream流的收集方法 api-lambda-app-----d13-demo2
注意:流只能使用一次