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表达式。

  • 相关阅读:
    Oracle基础知识整理
    linux下yum安装redis以及使用
    mybatis 学习四 源码分析 mybatis如何执行的一条sql
    mybatis 学习三 mapper xml 配置信息
    mybatis 学习二 conf xml 配置信息
    mybatis 学习一 总体概述
    oracle sql 语句 示例
    jdbc 新认识
    eclipse tomcat 无法加载导入的web项目,There are no resources that can be added or removed from the server. .
    一些常用算法(持续更新)
  • 原文地址:https://www.cnblogs.com/yanghaolie/p/6636125.html
Copyright © 2011-2022 走看看