函数式接口+匿名内部类+lambda表达式+方法引用+比较器

匿名内部类经常用来实现接口,尤其是当接口只有一个抽象方法时(即函数式接口)

函数式接口:只有一个抽象方法的接口(但可以有多个非抽象方法)

使用@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());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值