lambda表达式和stream流是Java8中的新特性,然后如今也远远不能算上新了,但这种写法相比传统还是有很大的改观,在简洁代码的同时又不失可读性,这种可读性可以说是在代码语言之前的传统形式,对于编码者是新的形式,但对于初学者也许是更容易理解的,本篇文章主要结合《Java8函数式编程》书来总结一些学习经验
lamda表达式是用来简化一些代码,首先看一个swing的原代码
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
System.out.println("button clicked");
}
})
这个方法实现了actionListener接口,通过重写actionPerformed,实现了一个输出动作
下面是简化后的代码
button.addActionListener(event-> System.out.println("button clicked"));
这里括号内相当于一个无名函数,箭头左边是参数,右边是la’mbda表达式
event 直接声明,不需要带类型,因为利用了javac的上下文推断其类型,根据addActionListener推断出类型ActionListener
lambda表达式还有一些变体
Runnable noArguments = () ->System.out.println
括号为空代表无参数,因为run方法也无参且返回类型为void
ActionListener oneArgument = event -> System.out.println("button clicked")
这种包含一个参数,且可省略
Runnable multiStatement = ()->{
System.out.println("button clicked")
}
主体可以用大括号,标识表达式的开始结束,可以用return和异常退出
BinaryOperator<Long> add =(x,y)->x+y;
多个参数,注意这里的尖括号里有类型,是为了方便编译器推断,如果不写默认为object类型,object 类型相加就会报错
final可以在第一次赋值后不再变化,引用这个变量就可以获取第一次的值,在lambda中可以直接引用值
原代码如下
final String name =getUserName();
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
System.out.println("hi"+name);
}
})
简化后
String name = getUserName();
button.addActionListener(event->System.out.println("hi"+name));
这里的name也是final的,如果多次赋值,也是会报错的
之前有类型推断的例子,这里补充一个
Predicate<Integer> atLeast5 = x ->x >5;
x>5返回一个布尔类型,是表达式的主体
下面是Predicate接口的源代码
public interface Predicate<T>{
boolean test(T t);
}
Stream流主要是针对for循环进行简化,事实上for循环也是对Iterator的hasNext进行的简化
int count =0;
for(Artist artist: allArtist){
if(artist.isFrom("London")){
count++;
}
}
简化后
long count = allArtists.stream().filter(artist.isFrom("London")).count();
stream对allAritists进行遍历,筛选出里面符合之后的条件的对象,作为一个集合,count再对这个集合进行求值