comparator java 复写_用java8重写Arrays.sort(oldWay, new Comparator<String>(){@Override public int compare...

本文介绍了Java 8如何使用Lambda表达式简化Comparator接口的实现,通过比较旧的匿名类方式与新的Lambda方式,展示了Lambda在代码简洁性和可读性上的优势。示例代码包括对字符串数组按忽略大小写排序以及自定义比较规则的排序。
摘要由CSDN通过智能技术生成

Java 8终于引进了lambda表达式,这标志着Java往函数式编程又迈进了一小步。

在Java 8以前的代码中,为了实现带一个方法的接口,往往需要定义一个匿名类并复写接口方法,代码显得很臃肿。比如常见的Comparator接口:

String[] oldWay = "Improving code with Lambda expressions in Java 8".split(" ");

Arrays.sort(oldWay, new Comparator() {

@Override

public int compare(String s1, String s2) { // 忽略大小写排序: return s1.toLowerCase().compareTo(s2.toLowerCase()); } }); System.out.println(String.join(", ", oldWay));

对于只有一个方法的接口,在Java 8中,现在可以把它视为一个函数,用lambda表示式简化如下:

String[] newWay = "Improving code with Lambda expressions in Java 8".split(" ");

Arrays.sort(newWay, (s1, s2) -> {

return s1.toLowerCase().compareTo(s2.toLowerCase()); }); System.out.println(String.join(", ", newWay));

Java 8没有引入新的关键字lambda,而是用()->{}这个奇怪的符号表示lambda函数。函数类型不需要申明,可以由接口的方法签名自动推导出来,对于上面的lambda函数:

(s1, s2) -> {

return s1.toLowerCase().compareTo(s2.toLowerCase());

});

参数由Comparator自动推导出String类型,返回值也必须符合接口的方法签名。

实际上,lambda表达式最终也被编译为一个实现类,不过语法上做了简化。

稍微变动一下

String[] strArr={"32","43"};

Arrays.sort(strArr,new Comparator(){ @Override public intcompare(String s1, String s2) { String c1 = s1 +s2; String c2 = s2 +s1; returnc1.compareTo(c2); }

用java8方式改写成如下形式:

String[] strArr={"21","33"};

Arrays.sort(strArr,(a,b)->{

String c=a+""+b;

String d=b+""+a; returnc.compareTo(d); }); 上面代码实现的是:for (int i=0;i

for (int j=i+1;j

Long a=Long.valueOf(numbers[i]+""+numbers[j]);

Long b=Long.valueOf(numbers[j]+""+numbers[i]);

if(a>b){

int temp=numbers[i];

numbers[i]=numbers[j];

numbers[j]=temp;

}

}

}

对于Java自带的标准库里的大量单一方法接口,很多都已经标记为@FunctionalInterface,表明该接口可以作为函数使用。

以Runnable接口为例,很多时候干活的代码还没有定义class的代码多,现在可以用lambda实现:

public static void main(String[] args) {

// old way:

Runnable oldRunnable = new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + ": Old Runnable"); } }; Runnable newRunnable = () -> { System.out.println(Thread.currentThread().getName() + ": New Lambda Runnable"); }; new Thread(oldRunnable).start(); new Thread(newRunnable).start(); }

在未来的Java代码中,会出现越来越多的()->{}表达式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值