Jdk8新特性

1.Lambda表达式:

   带有参数的表达式,是一段可以传递代码,可以被执行一次或者多次的代码,  Lambda表达式是一种精简的字面写法,其实就是把匿名内部类中“一定”要做的工作省略掉,然后由JVM通过推导把简化的表达式还原。

格式: (parameters参数) -> expression表达式或方法体。

  a:从jdk1.8开始为了方便用户开发方便专门提供了一个新的包,java.util,function,在这个包里针对用户有可能做的函数式接口做了一个公共的定义。最核心的为四个接口:
       功能型接口: function   有传入的参数,有返回值类型的   有一个apply()方法

         消费型接口:consumer      有传入的参数,无返回值类型的   有一个accept()方法

      供给型接口:Supplier        无传入的参数,  有返回值类型的    使用get()方法来获取这个返回的值

     断言型接口:Predicate       有传入的参数,但返回值是Boolean类型的  多用于判断和过滤,使用test()方法执行这段行为

2.Lambda表达式的优点

  a:极大的减少了代码的冗余,阅读性也好过冗长的内部类,和匿名类。

  b: 与集合类批处理操作结合,实现内部迭代,并充分利用现代多核CPU进行并行计算。之前集合类的迭代都是外部的,即客户代码。而内部迭代意味着由Java类库来进行迭代,而不是客户代码。

3.Lambda表达式的和匿名内部类的区别

a:在lambda中,this不是指向lambda表达式产生的那个对象,而是它的外部对象。

b:Java 编译器编译 Lambda 表达式并将他们转化为类里面的私有函数,它使用 Java 7 中新加的 invokedynamic 指令动态绑定该方法。但每一个匿名内部类编译器会为创建一个类文件。

4.方法的引用

         某些lambda表达式里面仅仅是调用了一个已存在的方法,在这种情况下,直接通过方法名称引用方法的形式可读性更高一些,这种形式就是方法引用。方法引用是一种更简洁易懂的lambda 表达式替换,其唯一用途就是支持Lambda的简写

    方法引用中::后只是方法名,不能加(); 

5.Stream

是用函数式编程方式在集合类上进行复杂操作的工具。

a:  forEach
    迭代集合中元素。接收一个 Lambda 表达式,然后在 Stream 的每一个元素上执行该表达式。
    此操作是及早求值方法。
    sList.stream().forEach((r)->System.out.println(r));

b: collect(toList()) :
    由Stream 里的值生成一个列表,是一个及早求值操作。      
   很多Stream 操作都是惰性求值,因此调用Stream 一系列方法之后,还需最后再调用一个类似collect 的及早求值方法返回集合。
list.stream().filter((s)->s.length()>2).collect(Collectors.toList());

c: map:

  如果由一个函数可以从一种类型的值转化为另一种类型的,map就可以操作此函数,将一个流中的值转化成一个新的流

   list.stream().map(x->x.toUpperCase()).collect(Collectors.toList());

d:filter:

  此处的filter是进行过滤的,会有一些条件进行判断。

e: flatMap :
    可用Stream 替换值, 然后将多个Stream 连接成一个Stream。

f: max和min:
    获取Stream中最大值或最小值。
    获取字符串List中长度最长的字符串长度:

   int max = list.stream().max(Comparator.comparing((x)->x.length())).get().length();

   System.out.println(max);   

   int i = list.stream().mapToInt((s)->s.length()).max().getAsInt();
  System.out.println(i);

g:reduce:

  通过指定的函数把stream中的多个元素汇聚为一个元素

   int j = Stream.of(1,2,3,4).reduce(0, (r,i)->r+i).intValue();
  System.out.println(j);

6. 串行,并行和并发的区别
Jdk8新特性

   并行是每个CPU执行一个程序,双核处理器是指在一个处理器上集成两个运算核心,相当于两个CPU同时工作,从而提高计算能力

7.时间日期类
a: 旧的日期时间API的以下缺点:

    非线程安全 - java.util.Date不是线程安全的,因此开发者必须在使用日期处理并发性问题。新的日期时间API是不可变的,并且没有setter方法。
    设计不佳 - 默认的开始日期从1900年,开始每月从1天从0开始,所以没有统一。不直接使用方法操作日期。新的API提供了这样操作实用方法。
    困难的时区处理 - 开发人员必须编写大量的代码来处理时区的问题。新的API设计开发保持特定领域设计。

b:LocalDate()

  LocalDate date = LocalDate.now();//2017-11-29 获取不带时区的日期

  LocalDateTime now = LocalDateTime.now();//2017-11-29T15:10:47.646  获取当前日期的时间

 // 将当前日期时间减去两天
    LocalDate  dateTime2 = now.minusDays(2);

// 构造一个指定日期时间的对象
    LocalDate dateTime = LocalDateTime.of(2016, 10, 23);

   String string = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());//2017-11-29 15:35:18   格式化  日期对象格式化为字符串 ,带有你指定的格式     

LocalDateTime parse = LocalDateTime.parse("2017-11-29 15:35:18",DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));//解析  格式字符串转化为日期对象  2017-11-29T15:35:18

  LocalDateTime now = LocalDateTime.now();//2017-11-29T15:10:47.646  获取当前日期的时间

8  String新增join(字符串集合或数组)方法:使用指定连接符连接多个字符串
      String[] arrStr=new String[]{"a","b","c"};
      System.out.println(String.join("-", arrStr));
 //a-b-c

9     try--with-resources

        在 JDK 7 之前,文件资源需要手动finally中关闭。try-with-resources 能够很容易地关闭在 try-catch 语句块中使用的资源。所谓的资源(resource)是指在程序完成后,必须关闭的对象。try-with-resources 语句确保了每个资源在语句结束时关闭。