java有参数有返回值实例,lambda表达式有参数有返回值

3.8 Lambda的参数和返回值

需求:

使用数组存储多个Person对象

对数组中的Person对象使用Arrays的sort方法通过年龄进行升序排序

下面举例演示java.util.Comparator接口的使用场景代码,其中的抽象方法定义为:

public abstract int compare(T o1, T o2);

当需要对一个对象数组进行排序时,Arrays.sort方法需要一个Comparator接口实例来指定排序的规则。假设有一个Person类,含有String name和int age两个成员变量:

public class Person {

private String name;

private int age;

// 省略构造器、toString方法与Getter Setter

}

传统写法

如果使用传统的代码对Person[]数组进行排序,写法如下:

import java.util.Arrays;

import java.util.Comparator;

public class Demo06Comparator {

public static void main(String[] args) {

// 本来年龄乱序的对象数组

Person[] array = {

new Person("古力娜扎", 19),

new Person("迪丽热巴", 18),

new Person("马尔扎哈", 20) };

// 匿名内部类

Comparator comp = new Comparator() {

@Override

public int compare(Person o1, Person o2) {

return o1.getAge() - o2.getAge();

}

};

Arrays.sort(array, comp); // 第二个参数为排序规则,即Comparator接口实例

for (Person person : array) {

System.out.println(person);

}

}

}

这种做法在面向对象的思想中,似乎也是“理所当然”的。其中Comparator接口的实例(使用了匿名内部类)代表了“按照年龄从小到大”的排序规则。

代码分析

下面我们来搞清楚上述代码真正要做什么事情。

为了排序,Arrays.sort方法需要排序规则,即Comparator接口的实例,抽象方法compare是关键;

为了指定compare的方法体,不得不需要Comparator接口的实现类;

为了省去定义一个ComparatorImpl实现类的麻烦,不得不使用匿名内部类;

必须覆盖重写抽象compare方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错;

实际上,只有参数和方法体才是关键。

Lambda写法

import java.util.Arrays;

public class Demo07ComparatorLambda {

public static void main(String[] args) {

Person[] array = {

new Person("古力娜扎", 19),

new Person("迪丽热巴", 18),

new Person("马尔扎哈", 20) };

Arrays.sort(array, (Person a, Person b) -> {

return a.getAge() - b.getAge();

});

for (Person person : array) {

System.out.println(person);

}

}

}

bVbwb4F

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值