JavaSE 8

作者: 陈兄 | 来源:发表于2019-01-25 14:04 被阅读0次
    image

    自从有了Java8,Java语言和库就仿佛获得可新生。lambda表达式可以允许开发人员编写简洁的“计算片段”,并将它们传递给其他代码。接收代码可以选择在合适的时候来执行"计算片段",这对于构建第三方库有深远的影响。
    尤其要指出一点,它彻底改变了集合的使用方式。我们不需要在指定计算 结果的过程(从起始遍历到结尾,如果某个元素满足了某个条件,就根据它计算一个值,然后将值添加到总和中),只需指定想要的什么样的结构。这样,代码就可以重新对计算排序————例如,来充分利用并行的优势。或者,如果你只希望匹配前100个元素,那么你不必在维护一个计算器,程序可以自动停止计算。

    lambda 表达式的语法

    排序

      Java7: public void compare(Stirng first,String second){
                Integer.compare(first.lengt(),second.length())
             }
      Java8: (Stirng first,String second) -> Integer.compare(first.lengt(),second.length())
    

           如果lambda表达式的参数类型可以被推导,那么就可以省略它们的类型,例如:

      Comparator<String> comp = (first,second) -> Integer.compare(first.lengt(),second.length())
    

    字符串拼接

           String.join(参数)参数可以来自于一个数组或者一个Iterable<? extends CharSequence>对象

      Java7: String str="a"+"/"+"b"+"/"+"c"
      Java8: String str=String.join("/","a","b","c");
      Java8: String[] strs=["a","b","c"]
             String str=String.join("/",strs);
    

    集合

           Java 8 中添加到集合类和接口方法

    类/接口 方法
    Iterable forEach
    Collection removeIf
    List replaceAll, sort
    Map forEach ,replace ,replaceAll, remove(key,value)(只有当key到value的映射存在时才删除),putIfAbsent, comput, computeIf (Absent / Present),merge
    Iterabtor forEachRemaining
    BitSet stream

           Map接口有许多对于并发十分重要的方法[暂无]

           接下来展示一些比较Java 8 比较常用的方法实例

    List sort

        List<String> list = new ArrayList<>();
            list.add("1");
            list.add("2");
            list.add("4");
            list.add("3");
    
        list.sort((String h1, String h2) -> h1.compareTo(h2));
        for (String strings: list){
            System.out.print(strings);
        }
    
        结果:1234
    

    Map forEach

        Map<String, String> map = new LinkedHashMap<>();
          map.put("key1","1");
          map.put("key2","2");
          map.put("key4","4");
          map.put("key5","5");
    
        map.forEach((k,v) -> System.out.print("k=" + k + "   v=" + v + "\n"));
    
        结果: k=key1   v=1
              k=key2   v=2
              k=key4   v=4
              k=key5   v=5
    

    Map merge

        Map<String, String> map = new LinkedHashMap<>();
          map.put("key1","我和");
          map.merge("key1","你",(value, newValue) ->  value.concat(newValue));
          System.out.print( map.get("key1"));
    
        结果:我和你
    

    Iterable forEach

        List<AdgAdRel> list = new ArrayList<>();
          AdgAdRel adgAdRel = new AdgAdRel();
          adgAdRel.setUrl("url1");
          AdgAdRel adgAdRel2 = new AdgAdRel();
          adgAdRel2.setUrl("url2");
          list.add(adgAdRel);
          list.add(adgAdRel2);
    
          list.forEach(adgAdRel1 -> {
              Map<String, Object> map =new LinkedHashMap<>();
              map.put("url",adgAdRel1.getUrl());
              map.forEach((k,v) -> System.out.print("k:"+ k + "  v:"+v + "\n"));
          });
    
        结果: k:url  v:url1
              k:url  v:url2
    

    性能测试

           最开始以为Java 8 流性能会比Java 7 好,测试结果如下:

        //5条数据
        for (AdgAdRel adgAdRel:adgAdList) {
            Map<String, Object> map =new LinkedHashMap<>();
            map.put("showTime",adgAdRel.getShowTime());
            map.put("width",adgAdRel.getWidth());
            map.put("height",adgAdRel.getHeight());
            map.put("type",adgAdRel.getType());
            resultMap.add(map);
        }
    
        //java 7循环 1毫秒
        System.out.print(System.currentTimeMillis()-date);
        //java 8循环 65左右毫秒
        System.out.print(System.currentTimeMillis()-date);
    
    

    总结

           对于一个简单集合来说,单纯的从集合中获取数据,Java8流处理的性能没有Java7好。
    Java8流处理适合复杂度比较高的判断,比如需要根据某些字段,以及条件进行筛选,流处理性能优势大些。

    相关文章

      网友评论

          本文标题:JavaSE 8

          本文链接:https://www.haomeiwen.com/subject/lavmjqtx.html