Lambda
我们在写一个数组的排序时,一般这样写
String[] array = ...
Arrays.sort(array, new Comparator<String>() {
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
});
Comparator是以匿名类的方式编写的
如果使用Lambda,可以这样写
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
String[] array = new String[] {"Apple","Orange","Banana","Lemon"};
Arrays.sort(array,(s1,s2) -> {
return s1.comapreTo(s2);
});
System.out .println(String.join(",",array));
}
}
如果只有一行return 还可以更简洁
Arrays.sort(array,(s1,s2) -> s1.compareTo(s2));
- FunctionalInterface
定义了单方法的接口称之为FunctionalInterface
用注解 @FunctionalInterface
标记
@FunctionalInterface
public interface Callable<V> {
V call() throws Exception;
}
使用Lambda的好处是不用编写FunctionalInterface
接口的实现类
除了使用Lambda,还可以传入方法来引用
public class Main {
public static void main(String[] args) {
String[] array = new String[] { "Apple", "Orange", "Banana", "Lemon" };
Arrays.sort(array, Main::cmp);
System.out.println(String.join(", ", array));
}
static int cmp(String s1, String s2) {
return s1.compareTo(s2);
}
}
上面的例子引用了静态方法
实例方法也是可以的
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
String[] array = new String[] { "Apple", "Orange", "Banana", "Lemon" };
Arrays.sort(array, String::compareTo);
System.out.println(String.join(", ", array));
}
}
也可以引用构造方法
import java.util.*;
import java.util.stream.*;
public class Main {
public static void main(String[] args) {
List<String> names = List.of("Bob", "Alice", "Tim");
List<Person> persons = names.stream().map(Person::new).collect(Collectors.toList());
System.out.println(persons);
}
}
class Person {
String name;
public Person(String name) {
this.name = name;
}
public String toString() {
return "Person:" + this.name;
}
}
这里的map函数需要一个FuntionalInterface
,person的构造函数new满足这个条件 返回类型为person类