Java 8 新特性:Lambda表达式
概述
Lambda表达式是Java SE 8中包含的一个新的重要特性。Lambda表达式提供了简洁清晰的方式来代替方法接口。Lambda也提升了从一个集合里爬取数据、过滤、迭代的易用性。此外新的并发性,提高了多核环境中的性能。
Lambda表示式语法
主体部分可以是一个表达式或者语句块。在表达式形式中,主体部分是一个简单的返回值,在语句块形式中,主体部分类似于方法体,将返回值返回给匿名方法的调用方。break
和continue
在最高级别中是非法的,但是在循环中是可以使用的。如果主体部分返回结果,那么每一个控制部分必须有返回值或者抛出异常。
例如:
(int x, int y) -> x + y
() -> 42
(String s) -> { System.out.println(s); }
第一个表达式取了两个参数,命名为x
和y
,以表达式形式返回x+y
。第二个表达式提取元参,并以表达式形式返回一个整数型42。第三个表达式取一个字符串类型参数,以语句块形式向控制台输出,且无返回值。
Lambda 示例程序
基于Lambda实现Runnable
@Test
public void lambda_runnable_test() {
// 匿名内部类实现runnable
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("使用匿名内部类实现Runnable");
}
};
/*
* 使用Lambda形式实现Runnable
* 注意:如果主体只包含一个语句块,那么{}可以省略
*/
// Runnable r2 = () -> { System.out.println("使用Lambda形式实现Runnable") };
Runnable r2 = () -> System.out.println("使用Lambda形式实现Runnable");
r1.run();
r2.run();
}
集合比较器-Comparator Lambda
/**
* 集合比较器Comparator Lambda示例
*/
@Test
public void comparator_lambda_test() {
List<Person> personList = Person.createShortList();
// 使用匿名内部类排序
Collections.sort(personList, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
// TODO Auto-generated method stub
return o1.getSurName().compareTo(o2.getSurName());
}
});
System.out.println("=== 根据surName倒序排列:基于匿名内部类排序 ===");
for (Person person : personList) {
person.printName();
}
System.out.println("=== 根据surName升序排列:基于Lambda表达式排序 ===");
Collections.sort(personList, (Person p1, Person p2) -> p1.getSurName().compareTo(p2.getSurName()));
for (Person person : personList) {
person.printName();
}
System.out.println("=== 根据surName倒序排列:基于Lambda表达式排序 ===");
Collections.sort(personList, (Person p1, Person p2) -> p2.getSurName().compareTo(p1.getSurName()));
for (Person person : personList) {
person.printName();
}
}
该示例中引用了一个Person
类,可参考博文下方源代码
基于Lambda进行事件处理
/**
* Listener 监听器 Lambda程序示例
*/
@Test
public void listener_lambda_test() {
JButton button = new JButton("Test Button");
// 添加监听器
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("通过匿名内部类点击按扭");
}
});
// 通过Lambda点击按扭
button.addActionListener(e -> System.out.println("通过Lambda点击按扭"));
// Swing stuff
JFrame frame = new JFrame("Listener Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(button, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
基于Lambda集合迭代
/**
* 集合迭代Lambda示例
*/
@Test
public void foreach_lambda_test() {
List<String> languages = Arrays.asList("SpringBoot","SpringCloud","SpringMVC","MyBatis");
System.out.println("==== jdk 8 之前遍历 =====");
// jdk 8 之前遍历
for (String language : languages) {
System.out.println(language + "\t");
}
System.out.println("==== 基于Lambda表达式迭代 =====");
// 基于Lambda表达式迭代
languages.forEach(language -> System.out.println(language + "\t"));
System.out.println("==== 基于jdk8方法引用 =====");
// 基于jdk8方法引用
languages.forEach(System.out::println);
}
参考链接:
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html#overview
http://www.importnew.com/16436.html
http://www.runoob.com/java/java8-lambda-expressions.html