java8新特性
java8(又称为jdk1.8)是java语言开发的一个主要版本。java8是oracle公司于2014年3月发布,可以看成是自java5以来最具革命性的版本。java8位java语言、编译器、类库、开发工具与JVM带来了大量新特性。
java8新特性简介
速度更快
代码更少(增加了新的语法:Lambda表达式)
强大的Stream API
便于并行
最大化减少空指针异常:Optional
Nashorn引擎,允许在JVM上运行JS应用
为什么使用Lambda表达式
Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使用java的语言表达能力得到了提升。
Lambda表达式语法:
Lmabda表达式:在java8语言中引入的一种新的语法元素和操作符。这个操作符为“->”,该操作符被称为Lambda操作符或箭头操作符。它将Lambda分为两个部分:
左侧:指定了Lambda表达式需要的参数列表
右侧:指定了Lambda体,是抽象方法的实现逻辑,也即Lambda表达式要执行的功能。
Lambda表达式的使用(分为六种情况介绍):
语法格式一,无参数,无返回值:
@Test public void test1(){ Thread thread1=new Thread(new Runnable() { @Override public void run() { System.out.println("---runable----"); } }); thread1.start(); System.out.println("------------------------"); Thread thread2=new Thread(()-> System.out.println("--lambda---")); thread2.start(); }
语法格式二,需要一个参数,但无返回值:
public void test2(){ Consumer<String> consumer=new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); } }; consumer.accept("测试"); System.out.println("-------------"); Consumer<String> consumer2=(String s)->{ System.out.println(s); }; consumer2.accept("lambda"); }
语法格式三,数据类型可以省略,因为可由编译器推断的出,称为“类型推断”:
@Test public void test3(){ Consumer<String> consumer1=(String s)->{ System.out.println(s); }; consumer1.accept("lambda"); System.out.println("-------------"); Consumer<String> consumer2=(s)->{ System.out.println(s); }; consumer2.accept("lambda类型推断"); //我们常见的类型推断 // List<String> list=new ArrayList<String>(); List<String> list=new ArrayList<>(); //int[] arry=new int[]{1,2,3}; int[] arry={1,2,3}; }
语法格式四,Lambda若只需要一个参数时,参数的小括号也可以省略:
@Test public void test4(){ Consumer<String> consumer1=(s)->{ System.out.println(s); }; consumer1.accept("lambda类型推断"); System.out.println("-------------"); Consumer<String> consumer2=s->{ System.out.println(s); }; consumer2.accept("lambda一个参数省略小括号"); }
语法格式五,Lambda需要两个或以上的参数,多条执行语句,并且可以有返回值:
@Test public void test5(){ Comparator<Integer> comparator1=new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { System.out.println("o1==="+o1); System.out.println("o2==="+o2); return o1.compareTo(o2); } }; System.out.println(comparator1.compare(31,22)); System.out.println("-----------------"); Comparator<Integer> comparator2=(o1,o2)->{ System.out.println("o1==="+o1); System.out.println("o2==="+o2); return o1.compareTo(o2); }; System.out.println(comparator2.compare(11,22)); }
语法格式六,当Lambda只有一条语句时,return与大括号若有,都可以省略
@Test public void test6(){ Comparator<Integer> comparator1=(o1,o2)->{ return o1.compareTo(o2); }; System.out.println(comparator1.compare(11,22)); System.out.println("-----------------"); Comparator<Integer> comparator2=(o1,o2)->o1.compareTo(o2); System.out.println(comparator1.compare(33,22)); System.out.println("************************"); Consumer<String> consumer1=s->{ System.out.println(s); }; consumer1.accept("lambda一个参数省略小括号"); System.out.println("==================="); Consumer<String> consumer2=s->System.out.println(s); consumer1.accept("lambda只有一条语句省略大括号"); }
总结
->左边:lambda形参列表的参数类型可以省略(类型推断);如果lambda形参列表只有一个参数,其一对()可以省略。
->右边:lambda体应该使用一对大{};如果lambda体只有一条执行语句(可能是return语句),省略这一对大{}和return。
Lambda表达式的本质:作为接口的实例,接口的要求符合函数式接口。