Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Java 8 是oracle公司于2014年3月发布,可以看成是自Java 5 以 来最具革命性的版本。Java 8为Java语言、编译器、类库、开发 工具与JVM带来了大量新特性。
这次先简要的说一下其特性和其主要特点,后续再针对一些重要的特性继续加以代码进行详情更新。
接下来先介绍函数式接口和Lambda表达式(因为Lambda表达式中要用到函数式接口,所以先介绍函数式接口)。
如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口。
可以通过 Lambda 表达式来创建该接口的对象。(若Lambda 表达式 抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽 象方法上进行声明)。
我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检 查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个 接口是一个函数式接口。
在 java.util.function 包下定义了Java 8 的丰富的函数式接口
代码体现:(消费型函数释接口)
@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); }
结果截图:
代码体现:断定型接口
@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; }
结果截图
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(); }
结果如下:
代码体现: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); }
结果截图:
这篇的介绍就先到这,下一篇总结一下Lambda表达式的六种使用情况。