Lambda表达式是java8新出的特性,lambda是一块代码,由于java中没有函数类型,我们不得不将实现特定功能的代码块写在匿名内部类中,早就有人调侃匿名内部类类型一行、方法名一行,真正方法内容一行,而有了lambad表达式,我们可以取代部分匿名内部类,减少多余代码,提高代码可读性。
常用场合:
1.实现Comparator接口,进行排序操作
2.实现Runnable接口,进行多线程操作
3.实现事件监听器ActionListener接口,进行事件监听
4.对集合数据进行操作,Java8为了支持Lambad对集合新增了很多方法,可以用更简洁的方法做同样的事情。
Ps:Lambda的用法很多,其余的静待你慢慢挖掘
例子1:实现Comparator接口排序。
用Lambda之前,我们先看看原来我们是怎么实现的:
List<String>list=Arrays.asList("b","d","c","a","e");
System.out.println(list);
list.sort(newComparator<String>() {
@Override
public int compare(String x, String y) {
return x.compareTo(y);
}
});
System.out.println(list);
List<String>list=Arrays.asList("b","d","c","a","e");
System.out.println(list);
list.sort((x,y)->x.compareTo(y));
System.out.println(list);
研究这两段代码,我们知道,其实排序的核心只有x.compareTo(y)这一句,Lambda表达式让人更一目了然。
例子2:实现Runnable接口的多线程。
依旧,先看看我们原来怎么做的:
new Thread(new Runnable() {
public void run() {
System.out.println("abc");
}
}).start();
new Thread(()->System.out.println("abc")).start();
上面的Lambda表达式里没有参数传递,所以()里是空的,而例1里传入了x,y,但是没有写出类型,这是因为如果Lambda表达式的参数类型可以被推导出来时可以省略不写,写上类型也是没有错的,不过要写上类型的话所有参数都必须写上。
例3:事件监听器。
自建一个Jframe窗体和一个按钮,事件代码如下:
button.addActionListener(newActionListener() {
@Override
public voidactionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "hello");
}
});
button.addActionListener((e)->JOptionPane.showMessageDialog(null,
"hello"));
button.addActionListener((e)->{
Stringx="hello";
JOptionPane.showMessageDialog(null, x);
});
我就不费事写一大串代码了,Lambda表达式的方法体与嵌套代码块有着相同的作用域,也适用同样的命名冲突和屏蔽规则。
例4:集合操作
还记得例1输出的数组集合吗?如果我们不是要一次性打印出整个数组,而是遍历,我们一般是这样写的:
for (String string : list) {
System.out.println(string);
}
list.forEach(x->System.out.println(x));
list.forEach(System.out::println);
List<String> list=new ArrayList<String>(Arrays.asList("b","d","c",null,"e"));
list.forEach(System.out::print);
list.removeIf(x->Objects.isNull(x));
list.forEach(System.out::print);
list.removeIf(Objects::isNull);
和上面是一样的效果。
正如你看到的那样,操作符 :: 将方法名称与类或对象名称分隔开。
有以下三种使用方式:
1.类 :: 实例方法
2.类 :: 静态方法
3.对象 :: 实例方法
第一种使用方式,第一个参数变成方法的接收者,并且其他参数也传递给该方法。例如例1的排序(x,y)->x.compareTo(y),可以写成String::compareTo。
第二种方式,所有的参数传递给静态方法。例如上面的x->Objects.isNull(x)等同于Objects::isNull。
第三种方式,在给定的对象上调用方法,并且参数传递给实例方法。例如x->System.out.println(x)等同于System.out::println。
此外还有很多新增的方法没有举例。但Lambda的基本用法想必已经很清晰了,使用Lambda可以使我们写出更简洁优雅的代码,希望大家一起学习。
文章来自我的个人博客,地址: http://jimblog.site/blog/articles/75.html