学习java8新特性的作用
给我们带来的好处,简化代码,提高效率
现在应该将关注点从"怎么做"到"做什么"的本质上,过程和形式并不重要
函数式编程思想作用
能够快速满足需求,达到目标
匿名内部类改造
作用:提高代码的可读性,可维护性,扩展性
直观体现:将匿名内部类改造成lambda表达式
策略设计模式
直观体现:通过定义接口或者抽象类封装算法或者行为,在实现具体的策略类
Lambda表达式
使用地方及约束:
使用函数式接口定义匿名内部类使用
语法:
Runable r=() ->System.out.println(“product”);
():参数列表
->:箭头操作符
System.out.println(“product”);:方法体
函数式接口
定义:
如果这个接口是一个函数式接口,才能使用Lambda表达式
使用注解**@FunctionalInterface** 检查当前接口是否满足函数式接口的要求
//函数式接口,有且仅有一个抽象方法,保证方法的唯一
@FunctionalInterface //检查当前接口是否满足函数式接口的要求
public interface MyPredicate {
boolean test(Product product);
}
是否所有的接口类型作为参数都可以使用Lambda表达式
**解释:**不是的,只有接口中只有一个抽象方法的时候,Lambda才能进行猜测传递的任务实际是实现接口中唯一的抽象方法,该接口为"函数式接口"
Lanmda表达式的特征
1.参数类型可以不用写
2.一个参数无需圆括号,多个参数需要写圆括号
3.主体语句中只有一句不需要大括号,有多个语句就需要大括号
4.主体只有一句则省略return和大括号
常见的函数式接口
函数式接口 | 参数类型 | 返回类型 | 说明 |
---|---|---|---|
Consumer 消费型接口 | T | void | 对象有参(类型T)无返回 |
Supplier< T> 供给型接口 | void | T | 对象无参有返回(类型T) |
Function<T,R> 函数型接口 | T | R | 对象的类型为T,返回值类型R |
Predicate 断言型接口 | T | boolean | 对象类型为T,返回值类型boolean |
方法引用
语法分析
双冒号 ::为引用运算符
使用::代替参数和箭头,引用了out的方法,
**注意事项:**函数式接口中的方法结构和方法体调用方法的结构一致
函数式接口中的方法结构和方法体中调用的方法的结构一致
即返回值和形参列表相同
Supplier<Double> supplier = new Supplier<>() {
@Override
public Double get() {
// random() 和 get() 结构一致,即返回值和形参列表相同
return Math.random();
}
};
方法引用的语法
1.对象的引用::实例方法名,使用的是Consumer接口
Arrays.asList("a","b","c").forEach(System.out::println);
2.类名::静态方法名,使用Supplier接口
Supplier<Double> suppp = Math::random;
3.类名::实例方法名
Function<Product,String> function3= Product::getName;
4.类名::new (构造器引用)
Supplier<Product> snew2= Product::new;
5.类型[] :: new (数组引用)
Function<Integer,String[]> fun2= String[]::new;
Lambda表达式延迟执行
作用:防止性能浪费,当满足条件的时候再进行执行里面的流程
接口中可以写的方法类型
1.默认的实例方法
default void delete(){
//通用方法
};
2.默认的静态方法,使用类来调用
static void list(){
}
3.私有方法
private void get(){
}
注意事项:
1.一个类不能同时实现两个接口,编译时会报错
2.接口中的没有进行修饰的方法,实现类都必须全部实现
static void list(){
}
3.私有方法
private void get(){
}
注意事项:
1.一个类不能同时实现两个接口,编译时会报错
2.接口中的没有进行修饰的方法,实现类都必须全部实现