匿名内部类经常用来实现接口,尤其是当接口只有一个抽象方法时(即函数式接口)
函数式接口:只有一个抽象方法的接口(但可以有多个非抽象方法)
使用@FunctionalInterface注解可以告诉编译器该接口是函数式接口
可以使用()->{}形式
抽象方法:
定义一个函数式接口R(这是无参的情况)(可见只能有一个抽象方法)(default是默认方法,非抽象的):
想实现这个接口,有两种方法:匿名内部类(接口可以有多个抽象方法)和函数式接口(只能有一个抽象方法)
匿名内部类和函数式接口
r.m();
函数式接口()里就是参数列表,这个抽象方法m是无参的,就空着。{}里是唯一的抽象方法的方法实现。
有参数的话
调用
lambda表达式就是函数式接口具体实现方法的参数和方法体
lambda表达式
阅读源码可以看到,forEach方法里面是增强的for循环,之所以能用()->{}
是因为
Consumer也是函数式接口。
List.sort和Collections.sort(lambda表达式/方法引用)
方法引用是简化lambda表达式的
Person::getName是一个方法引用,它等价于(Person p) -> p.getName()
使用Collections.sort()时,你需要将列表作为参数传入
建议使用List.sort
使用Lambda表达式: 按照名称升序
正序: Collections.sort(people, (p1, p2) -> p1.getName().compareTo(p2.getName()));
倒序:Collections.sort(people, (p1, p2) -> p2.getName().compareTo(p1.getName()));
正序: people.sort((p1, p2) -> p1.getName().compareTo(p2.getName()));
倒序:people.sort((p1, p2) -> p2.getName().compareTo(p1.getName()));
使用方法引用:
正序: Collections.sort(people, Comparator.comparing(Person::getName));
倒序:Collections.sort(people, Comparator.comparing(Person::getName).reversed());
正序:people.sort(Comparator.comparing(Person::getName));
倒序:people.sort(Comparator.comparing(Person::getName).reversed());
Strea流
比如:
int[]input=
Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
Array.stream(): stream前面可以是数组也可以是list
sc.nextLine().split(" "): stream里接受的一般也是数组集合,这里就是一个string[]。
.mapToInt(Integer::parseInt) mapToInt方法主要用于将流中的元素转换为int值,并返回个Int流。
里面Integer::parseInt其实是把流中的每个元素都调用Integer.parseInt方法。这是个方法引用,不用方法引用的话就是.mapToInt(s -> Integer.parseInt(s))
因为mapToInt返回的是int流,所以最后要转成Array。
如果input是个List,那就是 toArray();改为 collect(Collectors.toList());
List<Integer> inputList = Arrays.stream(sc.nextLine().split(" "))
.map(Integer::parseInt)
.collect(Collectors.toList());