Java8 新特性 详解-来瞅瞅吧

Java 8 (又称 jdk1.8)是 Java 语言开发的一个主要版本。Oracle 公司 2014年3月18日 发布 Java 8,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的 Stream API 等;

1.主要新特性

Lambda 表达式 - Lambda 允许把函数作为一个方法的参数【函数作为参数传递进方法中】

方法引用 - 方法引用提供了非常有用的语法,可以直接引用已有 Java 类或对象(实例)的方法或构造器,更加紧凑简洁,减少冗余代码

默认方法 - 默认方法就是一个在接口里面有了一个实现的方法

新工具 - 新的编译工具,如:Nashorn 引擎 jjs、类依赖分析器 jdeps

Stream API - 新添加的 Stream API (java.util.stream)把真正的函数式编程风格引入到 Java 中

Date Time API - 加强对日期与时间的处理

Optional 类 - Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常

Nashorn,Java Script 引擎 - Java 8 提供了一个新的 Nashorn javascript 引擎,它允许我们在 JVM 上运行特定的 javascript 应用


2.接口的默认方法

static方法

1、使用static修饰接口中的方法并且必须有主体

2、接口的static方法只能够被接口本身调用;接口名.方法名(...);

3、接口的static方法不能够被子接口继承;

4、接口的static方法不能够被实现类覆写及直接调用;


default方法

在接口中可以定义一个使用default修饰有方法体的方法,接口中可以对这个方法提供默认的一种实现。

1、使用default修饰接口中的方法并且必须有主体;

2、接口的default方法不能够被接口本身调用,需要接口的实例(实现类对象)来调用

3、接口的default方法可以被子接口继承、覆写或者直接调用

4、接口的default方法可以被实现类覆写及直接调用;


在接口中,经过static和default修饰的方法必须有方法体;

static修饰的方法调用方式为类.方法名

default修饰的方法必须是实现类的对象调用

static修饰的方法不能被子接口继承,default修饰的方法可以被子接口继承

并复写方法,就可以创建子接口实现类对象进行调用

使用static和default有什么好处:

Default:类似于抽取,可以多个实现类的统一的业务都抽取到default方法体体实现:


1:接口里写了方法体,所有的实现类和子类都拥有这个方法,都可以调用,不用再每一个都覆写;

2:我们已经开发好功能了,突然要增加需求,原始的方法:接口定义一个抽象方法,每一个实现去写实现类;现在,使用defaul,可以直接在接口中定义方法体,子类都不用动。


3.函数式接口

函数式接口 就是一个有且仅有一个抽象方法,有且仅有一个抽象方法,但是 Object 类的 public 方法除外,default 和 static 是可以搞的;

JDK 1.8 新增加的函数接口:

java.util.function 此包中包含了很多类,用来支持 Java的 函数式编程

函数式接口注解

@FunctionalInterface

我们在函数式接口上面加上此注解后,里面就只能够有一个抽象方法了,当然不加此注解且只有一个抽象方法的接口也是函数式接口,只是没有限定提示而已。


4.Lambda 表达式

简单的来说,可以看成是对匿名内部类的简写,使用 Lambda 表达式时,接口必须是函数式接口

特点 + 代码案例 :一个案例学会 Lambda


5.方法引用

静态方法引用

构造方法引用

实例方法引用

代码案例:Java 8 方法引用 简单代码案例


6.Java 8 Stream

Stream 使用一种类似 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象;

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

常用方法 : 之前文章有代码示例!Java 8 Stream 常用方法 + 代码示例


7.Optional 实例

以前的判断方式

	<函数式接口>  <变量名> = (参数1,参数2...) -> {
                    //方法体
       }

引入 Optional 之后

    @Test
    public static String test8(UserPo user){
        // 引入 Optional
        return Optional.ofNullable(user).map(u -> u.getPassword()).orElse("unkonwn");
    }

8.本地化日期时间 API

Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理。

    @Test
    public void test9(){
        // 处理时区不是必须的情况    获取当前的日期时间
        LocalDateTime currentTime = LocalDateTime.now();
        System.out.println("当前时间: " + currentTime);
        LocalDate date1 = currentTime.toLocalDate();
        System.out.println("date1: " + date1);
        Month month = currentTime.getMonth();
        int day = currentTime.getDayOfMonth();
        int seconds = currentTime.getSecond();
        System.out.println("月: " + month +", 日: " + day +", 秒: " + seconds);
        System.out.println("");
        System.out.println("==============================");
        System.out.println("");
        //    使用时区的日期时间API     获取当前时间日期
        ZonedDateTime dd= ZonedDateTime.now();
        System.out.println(dd);
        ZonedDateTime date2 = ZonedDateTime.parse(dd.toString());
        System.out.println("date1: " + date2);
        ZoneId id = ZoneId.of(ZoneId.SHORT_IDS.get("CTT"));
        System.out.println("ZoneId: " + id);
        ZoneId currentZone = ZoneId.systemDefault();
        System.out.println("当期时区: " + currentZone);
    }

Java8 新特性 详解-来瞅瞅吧

留波关注 ~~~~~ 么么哒

展开阅读全文

页面更新:2024-04-29

标签:注解   表达式   抽象   详解   函数   被子   接口   日期   代码   时间   方法

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top