Java8函数式编程-lambda表达式与stream流

前言

lambda表达式和stream流是Java8中的新特性,然后如今也远远不能算上新了,但这种写法相比传统还是有很大的改观,在简洁代码的同时又不失可读性,这种可读性可以说是在代码语言之前的传统形式,对于编码者是新的形式,但对于初学者也许是更容易理解的,本篇文章主要结合《Java8函数式编程》书来总结一些学习经验

lambda表达式

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流

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再对这个集合进行求值

你可能感兴趣的:(java,开发语言)