- 速度更快(底层的数据结构的改动,例子1:hashmap,jdk1.7之前采用的是数组+链表,之后在1.8之后采用的就是数组+链表+红黑树,除了添加以外都比之前的链表快,如果扩容的化,位置就是之前在老表的位置加上老表的长度。例子2:ConcurrentHashMap变成了无锁算法,CAS算法。例子3:内存结构的变化,永久区的消失,出现了MetaSpace,元空间,默认直接使用的是物理内存。物理内存贼大,所以垃圾回收机制就用的少了,OOM异常发生概率也低了)
- 代码更少(因为增加了新的语法Lambda表达式)
- 强大的Stream Api
- 便于并行
- 最大化减少空指针异常 Optional
最为核心的是Lambda表达式与Stream API
为什么使用Lambda表达式?
- Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更加简洁、更灵活的代码。作为一种更紧凑的代码风格,使java语言的表达能力得到了提升。(个人感觉,代码量少了,看起来就不会直接一目了然)。
代码如下效果:
package com.edu.util;
import org.junit.Test;
import java.util.Comparator;
import java.util.TreeSet;
public class TestLambda {
//原来的匿名内部类效果
@Test
public void test1(){
Comparator<Integer> comparable=new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1,o2);
}
};
TreeSet<Integer> ts=new TreeSet<>(comparable);
}
//用lambda表达式后的效果
@Test
public void test2(){
Comparator<Integer> comparator=(x,y)->Integer.compare(x,y);
TreeSet<Integer> ts=new TreeSet<>(comparator);
}
}
1.Lambda 表达式的基础语法,java8中引入一个新的操作符"->",改操作符称为箭头操作符或Lambda操作符。箭头操作符将Lambda表达式拆分成两部分。
左侧:Lambda 表达式的参数列表。对应着接口中的参数列表。
右侧:Lambda表达式中所需执行的功能,即Lambda体。对应着接口中的实现。
所谓的lambda表达式可以理解为对接口的一个实现的过
语法格式一:无返回值
()->System.out.println(“hello lambda!”);
例子如下:
@Test
public void test3(){
Runnable runnable=new Runnable() {
@Override
public void run() {
System.out.println("hello welcome!");
}
};
runnable.run();
System.out.println("--------------------------------------");
Runnable runnable1=()-> System.out.println("hello welcome!");
runnable1.run();
}
语法格式二:
有一个参数,并且无返回值
(x)->System.out.println(x)
@Test
public void test4(){
Consumer<String> num=(x)-> System.out.println(x);
num.accept("核力量");
}
语法格式三:
若只有一个参数,小括号可以省略不写
@Test
public void test5(){
Consumer<String> num=x-> System.out.println(x);
num.accept("核力量");
}
语法格式四:
若有两个以上的参数,并且lambda体中有多条语句
@Test
public void test6(){
Comparator<Integer> comparator=(x,y)->{
System.out.println("有多个参数");
System.out.println("有多条语句");
return Integer.compare(x,y);
};
}
语法格式五:
若lambda体中只有一条语句,return和大括号都可以省略不写。
@Test
public void test6(){
Comparator<Integer> comparator=(x,y)-> Integer.compare(x,y);
}
语法格式六:
lambda表达式的参数数据类型可以省略不写,因为JVM编译器可以通过上下文推断出:数据类型,也就是类型推断
lambda 表达式需要"函数式接口的支持"
函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。可以使用注解@FunctionalInterface 修饰,可以检查接口是不是函数式接口。添加了这个注解之后,这个类里面就只能写一个抽象方法,不然报错。
package com.edu.util;
public interface MyCon {
public Integer get(Integer i);
}
@Test
public void test7(){
Integer m=getm(100,x->x*x);
System.out.println(m);
}
public Integer getm(Integer x,MyCon con){
return con.get(x*x);
}