Java8

xiaoxiao2021-02-28  117

简单、干净、易读 提高并发的性能 使用、调试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 高阶函数 高阶函数是只传入参数或者返回值为函数接口的函数。
转载请注明原文地址: https://www.6miu.com/read-37665.html

最新回复(0)