首先,看一段代码:
import java.util.Arrays;
import java.util.Comparator;
/**
* @author Mao Qingbo
* @date 2020-09-12
*/
class LengthComparator implements Comparator<String> {
@Override
public int compare(String first,String second){
return first.length()-second.length();
}
}
public class LenCompTest{
public static void main(String[] args) {
String [] strings = {"abde","k","bb","dfgag","zzz","yousbbb"};
LengthComparator lcp = new LengthComparator();
// Arrays.sort(strings);
Arrays.sort(strings,lcp);
System.out.println(Arrays.toString(strings));
}
}
上述代码是为了将String类型数组按照字符串长度排序,我们的思路是先让LengthComparator类继承Comparator接口,然后将LengthComparator类实例化后传递给sort方法做参数。这句话得仔细的品,不然就会出现懵逼现象。
附上上述代码的运行结果:
[abde, bb, dfgag, k, yousbbb, zzz]
Process finished with exit code 0
可以看出,这样的处理方法没有任何问题。但是,这样做太复杂了,我只是想调用一个接口的方法而已...有没有简单的方法呢?答案是肯定的,那就是Java SE 8 引入的lambda表达式!
看一看用lambda表达式怎么解决这一问题:
import java.util.Arrays;
import java.util.Comparator;
/**
* @author Mao Qingbo
* @date 2020-09-12
*/
/*class LengthComparator implements Comparator<String> {
@Override
public int compare(String first,String second){
return first.length()-second.length();
}
}*/
public class LenCompTest{
public static void main(String[] args) {
String [] strings = {"abde","k","bb","dfgag","zzz","yousbbb"};
// LengthComparator lcp = new LengthComparator();
// Arrays.sort(strings);
// Arrays.sort(strings,lcp);
Arrays.sort(strings,(String first,String second) -> first.length() - second.length());
System.out.println(Arrays.toString(strings));
}
}
附上结果:
[abde, bb, dfgag, k, yousbbb, zzz]
Process finished with exit code 0
总结
(1)lambda表达式就是一个代码块,以及必须传入的代码的变量规范。
(2)表达式形式:参数,箭头(->)以及一个表达式。如果代码要完成的计算无法放入一个表达式中,就可以像写方法一样,把这些代码放入{}中,并包含显示的return语句。
(3)即使lambda表达式没有参数,仍然要提供空括号,就像无参方法一样。如果可以推断出一个lambda表达式的参数类型,则可以忽略其类型。
(4)无需指定lambda表达式的返回值类型。lambda表达式的返回类型总是由上下文推导得出。