java 8(又称为jdk1.8)之前,如果想将行为传入函数,仅有的选择是匿名类。java 8后,lambda表达式取代了匿名类,取消了模板,允许用函数式风格编写代码。这样有时可读性更好,表达更清晰。
lambda表达式的本质只是一个“语法糖”,由编译器推断并帮你转换包装为常规的代码,因此可以用更少的代码来实现同样的功能。
可变参数
//可变参数,调用时传递任意个参数
public static int addNums(int... ints) {
int sum = 0;
for (int i : ints) {
sum += i;
}
return 0;
}
//只能有一个可变参数,而且要放最后
public static int addNums(String str, int... ints) {
int sum = 0;
for (int i : ints) {
sum += i;
}
return 0;
}
lambda用法
//java 8 之前采用采用匿名内部类的形式实现线程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("又是虐狗的一天");
}
}).start();
//java 8 使用lambda表达式
//() -> 把()理解为一个没有名字的方法,匿名方法
new Thread(()-> System.out.println("又是虐狗的一天")).start();
Runnable target = () -> System.out.println("今天早点睡");
target.run();
//多行代码
Runnable target2 = () -> {
System.out.println("今天早点睡不");
System.out.println("不");
};
target2.run();
实现接口方法
interface Demoi {
int test(int a, int b);
}
Demoi demoi = (a, b) -> {
return a + b;
};
demoi.test(1, 2);
循环集合
//使用lambda表达式
List<String> names = Arrays.asList("张三","李四","王五");
names.forEach(name -> System.out.println(name));
//使用::
names.forEach(System.out :: println);
排序
//java 8 前使用匿名内部类排序
String[] strings = {"ABC","DEDF","FDFDF"};
Arrays.sort(strings, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
});
//java 8 使用lambda排序
Arrays.sort(strings, (String s1, String s2) -> s1.compareTo(s2));
lambda表达式需要多练习才能弄懂。