昨天内容回顾:
1、Lambda表达式 jdk1.8之后的新特性
Lambda表达式的前提:
1 Lambda表达式必须是接口类型。
2、接口中有且仅有一个抽象方法。
Lambda表达式的语法:
(方法的参数列表)->{方法体}
Lambda表达式的简化格式:
1、任意情况下,参数列表中的参数类型都可以省略。
2、如果参数列表只有一个参数,那么()可以省略。
3、如果方法体中有且仅有一条语句,那么{}和;一起省略,如果有return,那么return也要一起省略。
Lambda表达式的好处:
简化匿名内部类的书写,但是不能完全替代匿名内部类。
lambda表达式和匿名内部类的区别:
1、能使用Lambda表达式的地方就一定可以使用匿名内部类,但是能使用匿名内部类的地方不一定能使用Lambda表达式。
2、匿名内部类编译之后有class文件,lambda表达式编译之后不会产生class文件。
2、接口新特性
默认方法:
静态方法:
私有方法:
3、方法引用:
方法引用的好处:
方法引用可以替换部分的Lambda表达式的书写。
使用场景:
如果Lambda表达式的的方法体中有且仅有一条语句,且符合 对象.方法() 、类名 .方法() 、new 类名() ,那么就可以使用方法引用
代替Lambda表达式
语法:
对象.方法()------>对象::方法名 例如:System.out::println 注意:不需要写()
类名 .方法()----->类名::方法名 例如:Integer::parseInt
new 类名()------>类名::new 例如:Student::new
今日内容:
1、函数式接口
1、概念:有且仅有一个抽象方法的接口就叫做函数式接口。可以使用@FunctionalInterface注解检查。
注意:一个接口是不是函数式接口和@FunctionalInterface没有任何关系,只和抽象方法的个数有关。如果这个接口不是函数式接口,
那么加上这个注解之后就会编译报错。
例如:JDK中的Runnable接口就是一个函数式接口
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
2、使用场景:作为方法的参数或者返回值
3、JDK中常见的函数式接口
Supplier<T>:生产型接口
T get():get()方法不需要给参数,反而给你返回一个T类型的值。
Consumer<T>:消费型接口
void accept(T t):需要一个T类型的参数,没有返回值,通过accept将T类型的数据交给我们使用(消费) (掌握)
default Consumer<T> andThen(Consumer<? super T> after):将两个Consumer连接,分别消费数据
例如:
//遍历输出 (T t)
list.forEach(num->System.out.println(num));
System.out.println("--------------");
//方法引用
list.forEach(System.out::println);
Predicate<T>:判断型接口
boolean test(T t):将给定的T类型的参数在test方法中进行条件判断,返回判断结果。
Function<T,R>:转换型接口
R apply(T t):将T类型的参数传递给方法,转换成R类型之后返回。
2、Stream流
概念:Stream流就是一套操作集合的工具集。工具集:指的就是Stream流中已经封装好了很多操作集合的方法,我们当作工具直接用就行了。
Stream流操作的对象:单列集合、数组、Map集合(只能间接操作)。
使用注意事项:Stream流对象只能被使用一次,否则会出现如下异常:
java.lang.IllegalStateException: stream has already been operated upon or closed
Stream流操作的步骤:
1、生成Stream流对象
Stream<T> stream=单列集合对象.stream();
Stream<T> stream=Stream.of(T... t);
注意:Map集合必须要先转换成单列集合(keySet()或者entrySet())之后才可以生成Stream流对象。
2、调用Stream流对象的方法
Stream<T> filter(Predicate predicate):用于对流中的数据进行过滤,需要使用Predicate接口传递过滤条件
Stream<T> limit(long maxSize):截取前指定参数个数的数据,返回截取的元素组成的新流
Stream<T> skip(long n):跳过指定参数个数的数据,返回由该流的剩余元素组成的新流
static <T> Stream<T> concat(Stream a, Stream b):合并a和b两个流为一个流
Stream<T> distinct():对流中的元素去重(根据Object.equals(Object) )组成的流
Stream<T> sorted():返回由此流的元素组成的流,根据自然顺序排序
Stream<T> sorted(Comparator comparator):返回由该流的元素组成的流,根据提供的Comparator进行排序
Stream<R> map(Function mapper):将流中的数据转换成另一种类型进行存储,返回新的流对象。
Function转换型接口中的方法 R apply(T t)
void forEach(Consumer action):遍历消费流中的数据
long count():返回此流中的元素个数
3、将流中的数据转换成集合(可选操作)
List<String> listA = streamA.collect(Collectors.toList());
Set<Integer> setB = streamB.collect(Collectors.toSet());