java8新特性学习一(Lambda表达式)
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表达式的本质:作为接口的实例,接口的要求符合函数式接口。

浙公网安备 33010602011771号