JDk8学习
code见:https://gitee.com/_lzd/java-pracitce/tree/master/src/main/java/jdk8
函数式接口 (@FunctionalInterface注解)
特点:
1、只能有一个抽象方法
2、可以有多个默认方法
3、可以有多个static方法
4、抽象方法可以通过lambda表达式实现
lambda 语法
一、Lambda 表达式的基础语法:Java8中引入了一个新的操作符 "->" 该操作符称为箭头操作符或 Lambda 操作符 箭头操作符将 Lambda 表达式拆分成两部分:
左侧:Lambda 表达式的参数列表
右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体
语法格式一:无参数,无返回值
() -> System.out.println("Hello Lambda!");
语法格式二:有一个参数,并且无返回值
(x) -> System.out.println(x)
语法格式三:若只有一个参数,小括号可以省略不写
x -> System.out.println(x)
语法格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
Comparator<Integer> com = (x, y) -> {
System.out.println("函数式接口");
return Integer.compare(x, y);
};
语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
(Integer x, Integer y) -> Integer.compare(x, y);
上联:左右遇一括号省
下联:左侧推断类型省
横批:能省则省
二、Lambda 表达式需要“函数式接口”的支持
函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。 可以使用注解 @FunctionalInterface 修饰
可以检查是否是函数式接口
lambda表达式实现接口的几种方式
接口 IDemo 函数show(String str)
1、传统方式
Class Demo implements Idemo{
show(String str){
//逻辑
}
}
Demo demo = new Demo();
demo.show("123");
2、lambda方式(接口作为参数传递,在调用的时候再实现具体的逻辑)
class Demo{
void show(IDemo demo){
String str = "123";
demo.show(str)
}
}
Demo demo = new Demo();
demo.show((str) ->{
//对字符串str的处理逻辑
});
四大核心函数式接口
- 消费型
Consumer<T>
void accept(T var1);
- 供给型
Supplier<T>
T get();
- 断言型
Predicate<T>
boolean test(T t);
- 函数型
Function<T, R>
R apply(T var1);
方法/构造/数组引用
方法引用:若lambda体中的内容有方法已经实现了,我们可以使用方法引用(可以理解为方法引用是lambda的另一种表现形式)
- 三种格式:
- 对象::实例方法名
- 类::静态方法名
- 类::实力方法名
- 对象::实例方法名
二、构造引用(注意:需要调用的构造器参数列表要与函数式接口中抽象方法的参数列表保持一致。)
- 格式:
- ClassName::new
三:数组引用
- 格式:
- Type[]::new
Stream
stream的三个流程
一、创建
二、中间操作(执行不会有结果,必选加终结操作)
三、终止操作
- 创建
//一、collection 系列集合提供stream() 和 parallelStream()
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
//二、Arrays中的静态方法
String[] arr = new String[10];
Stream<String> stream2 = Arrays.stream(arr);
//三、通过stream中的静态方法of
Stream<Integer> stream3 = Stream.of(1, 23, 45);
//四 创建无限流递增
Stream<Integer> stream4 = Stream.iterate(0, (x) -> x + 2);
//五 生成无线流
Stream.generate(() -> Math.random());
- 中间操作
* 中间操作(执行不会有结果,必选加终结操作)
*
* 筛选与切片
* filter
* limit
* skip-通过前n个元素,若流中元素不足n时则返回一个空流
* distinct-筛选通过流生成元素的hashcode和requals去重复元素
*
* 映射
* map:接受一个函数,该函数会被映射到每个元素上,并将其映射成一个新的元素
* flatmap:接受一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。类似list.add 和 list.addAll的概念
*
* 排序
* sorted()——自然排序
* sorted(Comparator com)——定制排序
- 终结操作
* allMatch——检查是否匹配所有元素
* anyMatch——检查是否至少匹配一个元素
* noneMatch——检查是否没有匹配的元素
* findFirst——返回第一个元素
* findAny——返回当前流中的任意元素
* count——返回流中元素的总个数
* max——返回流中最大值
* min——返回流中最小值
* 归约 reduce(T identity, BinaryOperator) / reduce(BinaryOperator) ——可以将流中元素反复结合起来,得到一个值。(例如计算求和)
* collect——将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法(例如:集合转set\map\分组\分区等)