zoukankan      html  css  js  c++  java
  • java 8 学习一(概述)

    学习java8的新特性之前,简单看了下从java5开始历代版本的新特性,都是别人总结的。

    java5、java6、java7、java8的新特性 

      http://blog.csdn.net/samjustin1/article/details/52268004

    其中java 7 第四点介绍System.getJavaIoTempDir()....这些方法已经没有了,用System.getProperties()可以达到同样的目的。

    比如System.getUserDir()  可用System.getProperties(“user.dir”)代替。

    Map map = {name:“xxx”,age:18};//不可行

    作者是个复制粘贴党,估计都没试这些特性是否真添加了。

    Java8新特性

    http://www.cnblogs.com/chengJAVA/p/6113649.html

    1.函数式接口

      这里有个坑--哪怕有很多默认方法,只要接口只定义了一个抽象方法,它就仍然是一个函数式接口。 

    2.Lambda表达式

    3.增强接口(和抽象类很像)

    4.stream流的操作(和scala类似)

    5.IO/NIO的改进新增的API

    6.国际化(这个针对世界时区的),date类的新API (下面几个实例)

    LocalDate.now();//获取localdate 
    LocalDate.now().plusDays(-1L).atStartOfDay();//前一天凌晨0点
    LocalDate.now().atTime(LocalTime.NOON);//今天中午12点
    LocalDate.now().atTime(OffsetTime.now().plusHours(-1));//今天前一小时
    LocalDate.now().atTime(8, 30);//设置时间
    LocalDate.now().atTime(8, 30).toLocalDate();//提取日期
    LocalDate.now().atTime(8, 30).toLocalTime();//提取时间
    LocalDate.parse("2020-10-01");//解析字符串时间
    LocalDate.parse("20201005",DateTimeFormatter.ofPattern("yyyyMMdd"));//解析字符串时间

    Instant.now().toEpochMilli();//获取当前时间戳
    System.out.println(Clock.systemUTC());//格林尼治时区
    System.out.println(Clock.systemDefaultZone());//默认时区
    System.out.println(Clock.systemDefaultZone().getZone());//获取当前时区
    System.out.println(Clock.systemDefaultZone().millis());//时间戳

    之前处理时间都是用SimpleDateFormat和Calendar类来回转换,现在方便多了。

     
    并行与共享的可变数据,这两个要点(没有共享的可变数据,将方法和函数即代码传递给其他方法的能力)是我们平常所说的函数式编程范式的基石

    值是Java中的一等公民 ----可传递

    其他很多Java概念(如方法和类等)则是二等公民 ----编程语言中的其他结构也许有助于我们表示值的结构,但在程序执行期间不能传递,因而是二等公民。 

    Java 8方法引用 ??

    与用对象引用传递对象类似(对象引用是用new创建的),在Java 8里写下File::isHidden的时候,你就创建了一个方法引用,你同样可以传递它。

    谓词 (predicate
    在数学上常常用来代表一个类似函数的东西,它接受一个参数值,并返回truefalse即一个返回boolean值的函数

    从传递方法到 Lambda

    1.方法引用---要用它的话,你可以写:
    filterApples(inventory, Apple::isGreenApple);
    但是用前要定义isGreenApple方法
    public static boolean isGreenApple(Apple apple) {
    return "green".equals(apple.getColor());
    }
    2.把方法作为值来传递显然很有用,但要是为类似于isHeavyAppleisGreenApple这种可
    能只用一两次的短方法写一堆定义有点儿烦人。
    所以引入了一套新
    记法(匿名函数或Lambda
    可以这样写
      filterApples(inventory, (Apple a) -> "green".equals(a.getColor()) );
    也可以这样
      filterApples(inventory, (Apple a) -> a.getWeight() > 150 );
    还可以这样
      filterApples(inventory, (Apple a) -> a.getWeight() < 80 ||
    "brown".equals(a.getColor()) );

     二、为了更好地利用并行,Java 8中有一整套新的类集合API——Stream

    1.api

    2.CollectionsStreams之间做转换

    内部迭代与外部迭代

    Collection API相比,Stream API处理数据的方式非常不同。用集合的话,你得自己去做迭代的过程。你得用for-each循环一个个去迭代元素,然后再处理元素。我们把这种数据迭代的方法称为外部迭代

    相反,有了Stream API,你根本用不着操心循环的事情。数据处理完全是在库内部进行的。我们把这种思想叫作内部迭代。 

    并行(多线程)共享变量

     Stream API如何解决这个问题的?

    Java 8也用Stream APIjava.util.stream)解决了这两个问题:集合处理时的套路和晦涩,以及难以利用多核。 

    (1)在两个CPU上筛选列表,可以让一个CPU处理列表的前一半,第二个CPU处理后一半,这称为分支步骤

    (2) CPU随后对各自的半个列表做筛选

    (3)最后一个CPU会把两个结果合并起来 -----整体思想和mapReduce类似,分片处理再聚合

    对比旧的集合Collection和"新集合"Stream

    Collection主要是为了存储和访问数据,而Stream则主要用于描述对数据的计算。 

    作者建议 --筛选一个Collection(将上一节的filterApples应用在一个List上)的最快方法常常是将其转换为Stream,进行并行处理,然后再转换回List

    List<Apple> heavyApples =
    inventory.stream().filter((Apple a) -> a.getWeight() > 150) //并行则使用parallelStream() 这个方法,stream()串行运行
    .collect(toList());                      //把普通集合处理为Stream,计算完毕后再转为普通集合。

     默认方法的引出

    若要使用上面的代码.stream()方法。Java 8之前, List<T>并没有streamparallelStream方法,它实现Collection<T>接口也没有,因为当初还没有想到这些方法嘛!可没有这些方法,这些代码就不能编译。换作你自己的接口的话,最简单的解决方案就是让Java 8的设计者把stream方法加Collection接口,并加入ArrayList类的实现。 但是接口改变,之前的项目工程里所有的类都要去实现这个接口的新方法。

    这下你就进退两难了:你如何改变已发布的接口而不破坏已有的实现呢? 

    这就给接口设计者提供了一个扩充接口的方式,而不会破坏现有的代码。 Java 8在接口声明中使用新的default关键字来表示这一点。(牛逼!

    Java 8里,你现在可以直接对List调用sort方法。它是用Java 8 List接口中如下所示的默认方法实现的,它会调用Collections.sort静态方法: 

    default void sort(Comparator<? super E> c) {
        Collections.sort(this, c);
    }

    这意味着List的任何实体类都不需要显式实现sort,而在以前的Java版本中,除非提供了sort的实现,否则这些实体类在重新编译时都会失败。 

    1. 如果在好几个接口里有多个默认实现,是否意味着Java中有了某种形式的多重继承? 
    2. Optional<T>
    3. 模式匹配 

    理解行为参数化传递代码的"演化方式"
    java8前怎么做?用匿名内部类怎么实现?方法引用?再到Lambda表达式。

  • 相关阅读:
    PHP数字签名算法
    PHP日期相关类
    浏览器常见bug及解决办法
    PHPer整理的前端开发知识
    小程序之轮播图(2020.4.13更新)
    Android APK反编译 apktool使用教程
    秒懂-单列布局水平居中布局
    一句话搞定-phpStudy安装yaf扩展
    Git的简单安装
    人人都能读懂的css3 3d小demo
  • 原文地址:https://www.cnblogs.com/yanghaolie/p/6636125.html
Copyright © 2011-2022 走看看