简单、干净、易读
提高并发的性能
使用、调试lamada表达式
java 8 提供了一些新的类库
- java8 基础知识
- lamada 表达式及类库的介绍
- 实战lamada表达式
一、 为什么对java进行修改
1.现状,多核cpu的兴起,与java并发度不高,处理大型数据集合略显掣肘。
2.引入lamada表达式,典型的函数式编程。
面向对象编程,是对对象的抽象;函数式编程是对行为的抽象。
二、对函数式编程的理解
在思考问题时,考虑不可变值和函数。函数式对一个值进行处理,映射成另一个值。
三、3.1 lamada表达式
lamada表达式是更加上下文来进行类型推断的。
Runnable r = ()-> String str = "hello world";
3.2 引用值而不是变量
btn.setOnClickListener(new OnClickLisenter(){
@ovveride
public void onClick(View view){
print("hello world");
//如果要在此处使用外部类局部变量,是需要加final的
}
});
//同理,lamada表达式也是如此
String name = "110";
button.addActionListener(event -> print("event" + name);); //此处会报错
3.3 函数接口
只有一个方法的interface,称之为“函数接口”
jdk提供的几个重要的函数接口
Predicate<T> boolean
Consumer<T> void //只输入,不输出
Function<T,R> // 转换
Supplier<T> 只输出,不输入
UnaryOperator<T> //输入、输出类型相同
BinaryOperatpr<T>//输入、输出类型相同
3.4 类型推断
3.3中所示的接口函数,一定要进行泛型说明,否则会编译错误
BinaryOperator<Long> b = (x,y)-> x+y;
BinaryOperator b = (x,y)->x+y; //编译错误
四、4.1 外部迭代到内部迭代
外部迭代最直接的影响就是 代码可读性差。
//传统写法
List<Artist> artists = ....;
int count = 0;
for(int i=0;i<artists.size();i++){
if(artists.get(i).isFromLondon()){
count++;
}
}
//内部迭代
artists.stream()
.filter(artis -> artis.isFromLondon())
.count()
4.2 实现机制
分析如下代码:
artists.stream()
.filter(artis -> artis.isFromLondon())
.count()
artists.stream()
.filter(artis -> artis.isFromLondon()); 此处的filter的操作是 惰性求值;
.count() ; count() 是及早求值
4.3 常见的流操作
4.3.1 collect(toList()) 及早求值操作
List<String> lists = Stream.of("q","w","e") //将item变为stream
.collect(Collectors.toList());
4.3.2 map 对应的接口函数 funtion<T,R>
4.3.3 filter predicate<T>
4.3.4 flatmap
4.3.5 min(Comapre.Comparator) max (Options)
4.3.6 通用模式(外部迭代)
4.3.7 reduce 在多个数值中,找出某个数值 , 比如min max
4.4 重构遗留代码
//找出长度超过一分钟的歌曲名称
public Set<String> findLongTracks(List<Arlbum> arlbums){
Set<String> trackNames = new HaskMap();
for(Arlbum a: arlbums){
for(Track track:a.getTrackLists()){
if(track.lenght > 60){
trackNames.add(track.getName());
}
}
}
return trackNames;
}
//使用java8
public Set<String> findLongTracks(List<Arlbum> arlbums){
arlbums.stream()
.flatmap(arlbum-> arlbum.getTrackLists())
.filter(track -> track.lenght>60)
.map(track-> track.getName())
.collect(toSet());
}
4.5 高阶函数
高阶函数是只传入参数或者返回值为函数接口的函数。