目录
一、Java8的新特性
1、速度更快 2、代码更少 3、强大的Stream APL 4、便于并行 5、最大化减少空指针异常
6、Nashorn引擎,允许在JVM上运行JS应用。
二、并行流与串行流
1、并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。
并行的流可以很大程度上提高程序的执行效率。
2、Stream APL可以声明性地通过parallel()与sequential()在并行流与顺序流之间的切换。
三、Lamdba表达式
Lamdba是一个匿名函数,也就是一段可以传递的代码。可以写出更简洁、更灵活的代码,使Java的语言表达能力更强,lambda的本质是作为函数式接口的实例。
示例代码:
public class LambdaTest {
@Test
public void test1(){
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("你是老六");
}
};
runnable.run();
System.out.println("----使用lambda操作----");
Runnable runnable1 = ()-> System.out.println("老六是你");
runnable1.run();
}
@Test
public void test2() {
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1,o2);
}
};
int compare = comparator.compare(11, 12);
System.out.println(compare);
System.out.println("----使用lambda操作----");
Comparator<Integer> comparator1 = ((o1, o2) -> Integer.compare(o1,o2));
int compare1 = comparator1.compare(56, 34);
System.out.println("compare1 = " + compare1);
System.out.println("----使用lambda操作2----");
Comparator<Integer> comparator2 = Integer::compare;
int compare2 = comparator2.compare(57, 45);
System.out.println("compare2 = " + compare2);
}
}
语法介绍:
public class LambdaTest1 {
@Test
public void Test01(){
/**
* -> :lambda操作符,又叫箭头操作符
* ->:左边是lambda的形参列表,即接口中的抽象方法的形参列表
* -> 右边是lambda体,即重写的抽象方法的方法体
*/
Runnable runnable = () -> System.out.println("5G");
runnable.run();
}
}
lambda不同的语法
public class LambdaTest1 {
@Test
public void test1(){
/**
* 无参,无返回值
* 普通写法
*/
Runnable runnable = new Runnable(){
@Override
public void run() {
System.out.println("猫和老鼠");
}
};
runnable.run();
System.out.println("********lambda表达式*******");
Runnable runnable1 = () -> System.out.println("lambda的猫和老鼠");
runnable1.run();
}
@Test
public void test2(){
/**
* 有一个参数,无返回值
* 普通写法
*/
Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
consumer.accept("虹猫蓝兔仗剑走天涯");
System.out.println("********lambda表达式*******");
Consumer<String> consumer1 = (o) -> System.out.println(o);
consumer1.accept("lambda虹猫蓝兔仗剑走天涯");
}
@Test
public void test3(){
Comparator<String> comparator = new Comparator<>(){
/**
*有两个参数,有返回值,执行多条语句
*/
@Override
public int compare(String o1, String o2) {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
}
};
System.out.println(comparator.compare("汤姆", "杰瑞"));
System.out.println("********lambda表达式*******");
Comparator<String> comparator1 = (o1, o2) -> {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
};
System.out.println(comparator1.compare("红猫", "红猫"));
}
}
四、函数式接口
4.1、什么是函数式接口
接口中只声明了一个抽象方法,那么这个接口就称为函数式接口。
4.2、为什么需要函数式接口
因为只有函数式接口提供实现类的对象时,才可以使用lambda表达式
4.3、api中函数式接口所在的包
jdk8中声明在java.util.function包下。
4.4、4个基本的函数式接口
接口 方法
消费型接口:Consumer<T> void accept(T t)
供给型接口: Supplier<T> T get()
函数型接口: Function<T,R> R apply(T t)
判断型接口: Predicate<T> boolean test(T t)