Java8

102 阅读2分钟

简单、干净、易读
提高并发的性能
使用、调试lamada表达式

java 8 提供了一些新的类库

  1. java8 基础知识
  2. lamada 表达式及类库的介绍
  3. 实战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 高阶函数
    高阶函数是只传入参数或者返回值为函数接口的函数。