转载

Java语言高级篇之jdk8新特性(一)

Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Java 8 是oracle公司于2014年3月发布,可以看成是自Java 5 以 来最具革命性的版本。Java 8为Java语言、编译器、类库、开发 工具与JVM带来了大量新特性。

这次先简要的说一下其特性和其主要特点,后续再针对一些重要的特性继续加以代码进行详情更新。

jdk8的新特性有:

  • 函数式接口
  • Lambda表达式
  • 方法引用/构造器引用
  • 更强的Strean API
  • 接口的增强
  • Optional
  • 新的时间和日期API
  • 其它新特性,如注解中的重复注解、类型注解,HashMap底层的变化,JVM中Metaspace取代PermGen空间等

新特性特点:

  • 速度更快
  • 代码更少(增加了新的语法:Lambda 表达式)
  • 强大的 Stream API
  • 便于并行
  • 最大化减少空指针异常:Optional
  • Nashorn引擎,允许在JVM上运行JS应用

接下来先介绍函数式接口和Lambda表达式(因为Lambda表达式中要用到函数式接口,所以先介绍函数式接口)。

什么是函数式接口?

如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口。

可以通过 Lambda 表达式来创建该接口的对象。(若Lambda 表达式 抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽 象方法上进行声明)。

我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检 查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个 接口是一个函数式接口。

java.util.function 包下定义了Java 8 的丰富的函数式接口

Jdk8中关于Lambda表达式提供的4个基本的函数式接口:

Java语言高级篇之jdk8新特性(一)

代码体现:(消费型函数释接口)

@Test//消费型接口

public void test1(){

    //消费型接口:(常规实现)
    unforgettableTime(6000, new Consumer<Double>() {
        @Override
        public void accept(Double aDouble) {
            System.out.println("2020年等疫情结束后要好好珍惜热爱生活,准备出去旅行,预计花费:" + aDouble);
        }
    });

    System.out.println("********************");
    //Lambda实现消费型接口:
    unforgettableTime(9999,money -> System.out.println("医护人员太辛苦了,冒着生命危险去死神手里抢救同胞,应该象征性的奖励:" + money));
}

public void unforgettableTime(double money, Consumer<Double> con){
    con.accept(money);
}

结果截图:

Java语言高级篇之jdk8新特性(一)

代码体现:断定型接口

@Test//断定型接口:过滤字符中含有“京”的字符串
    public void test2(){
        List<String> list = Arrays.asList("北京","南京","天津","东京","西京","普京");
    //(常规实现)
        List<String> filterStrs = filterString(list, new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.contains("京");
            }
        });

        System.out.println(filterStrs);
        //Lambda实现断定型接口:
        List<String> filterStrs1 = filterString(list, s -> s.contains("京"));
        System.out.println(filterStrs1);
    }

    //根据给定的规则,过滤集合中的字符串。此规则由Predicate的方法决定
    public List<String> filterString(List<String> list, Predicate<String> pre){

        ArrayList<String> filterList = new ArrayList<>();

        for(String s : list){
            if(pre.test(s)){
                filterList.add(s);
            }
        }

        return filterList;

    }

结果截图

Java语言高级篇之jdk8新特性(一)

什么是Lambda表达式,为什么使用它

Lambda是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以

传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更 灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了

提升

Lambda 表达式:在Java 8 语言中引入的一种新的语法元素和操 作符。这个操作符为 “->” , 该操作符被称为 Lambda 操作符 或箭头操作符。它将 Lambda 分为两个部分:

左侧:指定了 Lambda 表达式需要的参数列表 右侧:指定了 Lambda 体,是抽象方法的实现逻辑,也即 Lambda 表达式要执行的功能

例如:

1.举例: (o1,o2) -> Integer.compare(o1,o2);
2.格式:
  -> :lambda操作符 或 箭头操作符
 ->左边:lambda形参列表 (其实就是接口中的抽象方法的形参列表)
 ->右边:lambda体 (其实就是重写的抽象方法的方法体)

可能看定义比较抽象,下面用具体例子来体会一二Lambda表达式使用前后的对比:

代码体现:

@Test
    public void test1(){

        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("少年强则中国强");
            }
        };

        r1.run();

        System.out.println("***常规实现在上*****Lambda实现在下****");

        Runnable r2 =() -> System.out.println("2020年中华民族通过抗疫再次向世界证明我们是团结的一家人");
        r2.run();
    }

结果如下:

Java语言高级篇之jdk8新特性(一)

代码体现:Comparetor接口的使用

@Test
    public void test2(){

        Comparator<Integer> com1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        };

        int compare1 = com1.compare(12,21);
        System.out.println(compare1);

        System.out.println("***常规实现在上*****Lambda实现在下****
");
        //Lambda表达式的写法
        Comparator<Integer> com2 = (o1, o2) -> Integer.compare(o1,o2);

        int compare2 = com2.compare(32,21);
        System.out.println(compare2);
        }

结果截图:

Java语言高级篇之jdk8新特性(一)

这篇的介绍就先到这,下一篇总结一下Lambda表达式的六种使用情况。

原文  https://segmentfault.com/a/1190000022266823
正文到此结束
Loading...