Lamda表达式
JDK在不断升级的过程中,要致力解决的问题之一就是让程序代码变得更加简洁。JDK8引入的Lamda表达式在简化程序代码方面大显身手,它用简明扼要的方法来表达某种功能所包含的操作。在各种遍历访问集合元素的场合,运用lamda表达式可以大大简化操纵集合的程序代码。
Lamda表达式基本用法
下面的代码通过3种方式遍历访问List列表,其中第二和第三种方式使用Lamda表达式。
public class LamdaTest {
public static void main(String[] args) {
String[] ards = {"Tom", "Mike", "Jone", "Linda"};
List<String> names = Arrays.asList(ards);
//方式一:传统的遍历集合的方式
for (String name : names) {
System.out.println(name);
}
//方式二:使用Lamda表达式
names.forEach(name -> System.out.println(name));
//方式三:使用Lamda表达式
names.forEach(System.out::println);
}
}
Lamda表达式的基本语法为:
(Type1 param1,Type2 param2,...,TypeN paramN)->{
statement1;
statement2;
//...
return statementM;
}
从Lamda表达式的基本语法可以看出,Lamda表达式可以理解为一段带有输入参数的执行语块,这种表达式方式也称为函数表达式。
方式二的Lambda表达式的完整与法应该是
names.forEach(name -> {
System.out.println(name);
return;
});
Lambda表达式还有各种简化版:
(1)参数类型可以省略。
(2)当Lambda表达式的参数只有一个时,可以省略小括号。
(3)当Lambda表达式只包含一条语句时,可以省略大括号、语句末尾的分号。此外,当return没有返回值时也可以省略
方式三还通过“::”来直接调用println()方法
names.forEach(System.out::println);
用Lambda表达式代替内部类
Lambda表达式的一个重要用武之地是代替内部类。例如,在下面的代码中,用3种方式创建线程。其中方式二和方式三使用了Lambda表达式。
public class InnerTester {
public static void main(String[] args) {
//方式一:使用匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello World!");
}
}).start();
//方式二:使用Lambda表达式
new Thread(()->System.out.println("Hello World!")).start();
//方式三:使用Lambda表达式
Runnable race = () -> System.out.println("Hello World!");
new Thread(race).start();
}
}
用Lambda表达式对集合进行排序
一下代码提供了3种对集合进行排序的大方式。其中方式二和方式三都采用了Lambda表达式。
public class Tester01 {
public static void main(String[] args) {
String[] data={"Tom","Mike","Mary","Linda","Jack"};
List<String> names = Arrays.asList(data);
//方式一:通过创建匿名的Comparator实例来排序
Comparator<String> cp = new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return (s1.compareTo(s2));
}
};
Collections.sort(names,cp);
//方式二:用Lambda表达式来排序
Comparator<String> sortByName= (String s1, String s2) -> (s1.compareTo(s2));
Collections.sort(names,sortByName);
//方式三:用Lambda表达式来排序
// Collections.sort(names,(String s1,String s2)->s1.compareTo(s2));
Collections.sort(names, Comparator.naturalOrder());
names.forEach(System.out::println);
}
}
输出结果
Jack
Linda
Mary
Mike
Tom
Lambda表达式中的方法引用
编译器能根据上下文来推断Lambda表达式的参数的场合,可以在Lambda表达式中省略参数,直接通过“::”符号来引用方法。方法引用的语法格式有一下3中
x->System.out.println(x) 等同于:System.out::println //引用实例方法
(x,y)->Math.max(x,y) 等同于:Math::max //引用静态方法
x->x.toLowerCase() 等同于:String::toLowerCase //引用实例方法
在Lambda表达式中,对构造方法的引用的语法如下:
ClassName::new
例如
x->new BigDecimal(x) 等同于 BigDecimal::new
函数式接口
Runnable race=()->System.out.print("HelloWord");