一Lambda表达式1. Lambda表达式使用前后对比举类一Test public void test(){ Runnable r1 new Runnable() { Override public void run() { System.out.println(我爱北京天安门); } }; r1.run(); System.out.println(******************************); //lambda表达式的写法 Runnable r2()-System.out.println(我爱北京天安门); r2.run(); }举类二Test public void test2(){ ComparatorInteger com new ComparatorInteger() { Override public int compare(Integer o1, Integer o2) { return Integer.compare(o1,o2); } }; int compare com.compare(12, 15); System.out.println(compare); System.out.println(******************************); //lambda表达式的写法 ComparatorInteger com2 (o1,o2)-Integer.compare(o1,o2); int compare1 com2.compare(21, 15); System.out.println(compare1); }2.lambda表达式的基本语法1.举类(o1,o2)-Integer.compare(o1,o2);2.格式》lambda操作符或 箭头操作符》左边lambda形参列表其实就是接口的抽象方法的形参列表》右边lambda体其实就是重写的抽象方法的方法体3.如何使用分为六种情况//语法格式一无参无返回值 Runnable r1 ()- {System.out.println(hello lambda);}; //语法格式二一个参数但是没有返回值 ConsumerString con(String str)- {System.out.println(str);}; //语法格式三数据类型可以省略因为可由编译器推断出称为“类型推断” ConsumerString con2(str)- {System.out.println(str);}; //语法格式四只有一个参数时参数的小括号可以省略 ConsumerString con3str- {System.out.println(str);}; //语法格式五需要两个或以上参数多条执行语句并且可以由返回值 ComparatorInteger com (o1,o2)-{ System.out.println(实现函数式接口方法); return Integer.compare(o1,o2); }; //语法格式六当lambda体只有一条执行语句时return与大括号若有都可以省略 ComparatorInteger com2 (o1,o2)-Integer.compare(o1,o2);4.总结六种情况》左边lambda形参列表的参数类型可以省略类型推断如果lambda形参列表只一个参数其一对()也可以省略》右边lambda 体应该使用一对{}包裹如果lambda体只一条执行语句可能是return语句省略这一对{}和return关键字二函数式接口1.函数式接口的使用说明》如果一个接口中只声明一个抽象方法则此接口就称为函数式接口。我们可以》在一个接口上使用FunctionalInterface 注解这样做可以检查它是否是一个函数式接口。》lambda表达式的本质作为函数式接口的实例2.java8中关于lambda表达式提供的4个基本的函数式接口具体使用3.总结3.1何时使用lambda表达式当需要对一个函数式接口实例化的时候可以使用lambda表达式。3.2 何时 使用给定的函数式接口如果我们开发中需要定义一个函数式接口首先看看在已有的jdk提供的函数式接口是否提供了能满足需求的函数式接口。如果有则直接调用即可不需要自己再定义了。三方法引用1.理解方法引用可以看做式lambda表达式深层次的表达换句话说方法引用就是lambda表达式也就是函数式接口的一个实例通过方法的名字来指向一个方法。2.使用情境当要传递给lambda体的操作已经有实现的方法了可以使用方法引用。3.格式类或对象方法名4.分为如下的三种情况情况1对象非静态方法情况 2类静态方法情况3类非静态方法5.要求要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型相同针对情况1和情况2当函数式接口方法的第一个参数是需要引用方法的调用者并且第二个参数是需要引用方法的参数或无参数时ClassnameMethodName针对情况36.使用建议如果给函数式接口提供实例恰好满足方法引用的使用情景大家可以考虑使用方法引用给函数式接口提供实例。如果不熟悉方法引用可以使用lambda 表达式7.使用举类Test public void test4() { ConsumerString con s- System.out.println(s); con.accept(北京欢迎你); System.out.println(****************); PrintStream ps System.out; //方法引用1对象非静态方法名 ConsumerString con2ps::println; con2.accept(北京欢迎你2); } Test public void test5(){ FunctionDouble,Long fun1 d-Math.round(d); System.out.println(fun1.apply(14.2)); System.out.println(****************); //方法引用2类静态方法名 FunctionDouble,Long fun2Math::round; System.out.println(fun2.apply(14.6)); } Test public void test6(){ Person per new Person(20,tom); FunctionPerson ,String f1p-p.getName(); System.out.println(f1.apply(per)); System.out.println(****************); //方法引用3类非静态方法名 FunctionPerson ,String f2Person::getName; System.out.println(f2.apply(per)); }四Stream API1.Stream API 的理解》stream 关注的 是对数据的运算与CPU打交道集合关注的是数据的存储与内存打交道》java 8提供了一套api使用这套api可以对内存中的数据进行过滤排序映射归约等操作2.注意点》stream 自己不会存储元素》stream 不会改变源对象。相反他们会返回一个持有结果的新stream》stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行3.stream 的使用流程1stream的实例化2一系列的中间操作过滤映射....3)终止操作4.使用流程的注意点》一个中间操作链对数据源的数据进行处理》一旦执行终止操作就执行中间操作链并产生结果。之后不会在被使用5.stream实例化Test public void test7(){ //实例化方式一调用集合的stream() ListEmployee employees EmploeeData.ListEmployees(); StreamEmployee stream employees.stream(); System.out.println(stream); //实例化方式二调用数组的静态stream() Integer[] arr new Integer[]{1,2,3,4,5,6,7,8,9,10}; StreamInteger stream1 Arrays.stream(arr); System.out.println(stream1); //实例化方式三调用类Stream的of()方法 StreamInteger stream2 Stream.of(arr); System.out.println(stream2); //实例化方式四Stream类的迭代器和生成器 //迭代器,生成十个偶数 Stream.iterate(0,t-t2).limit(10).forEach(System.out::println); //生成器生成十个随机数 Stream.generate(Math::random).limit(10).forEach(System.out::println); }6.中间操作和终止操作public void test8(){ //中间操作StreamEmployee stream EmploeeData.ListEmployees().stream(); // filter(P):过滤器过滤年龄大于30的员工 stream.filter(e-e.getAge()30).forEach(System.out::println); System.out.println(*****************); // limit(int n):显示前几条数据 EmploeeData.ListEmployees().stream().limit(3).forEach(System.out::println); System.out.println(*****************); //skip(int n):跳过 前n条数据显示剩余数据如果跳过数据大于集合数据返回空的stream EmploeeData.ListEmployees().stream().skip(4).forEach(System.out::println); System.out.println(*****************); //map(Functional f):返回映射后的stream并输出 EmploeeData.ListEmployees().stream().map(e-e.getName()).forEach(System.out::println); System.out.println(*****************); //sorted():排序 Arrays.asList(1,2,8,5,-1,23,6).stream().sorted().forEach(System.out::println); //sorted(Comparator com):定制排序 EmploeeData.ListEmployees().stream().sorted((e1,e2)-Double.compare(e1.getSalary(),e2.getSalary())).forEach(System.out::println);//终止操作// allMatch():判断是否都符合 boolean allMatch EmploeeData.ListEmployees().stream().limit(5).allMatch(e - e.getAge() 20); System.out.println(allMatch); //max():求最大值 OptionalInteger max EmploeeData.ListEmployees().stream().map(e - e.getAge()).max(Integer::compareTo); System.out.println(max); //forEeach():迭代. Arrays.asList(1,2,8,5,-1,23,6).stream().forEach(System.out::println); //reduce():归约 Integer reduce Arrays.asList(1, 2, 8, 5, -1, 23, 6).stream().sorted().reduce(0, Integer::sum); System.out.println(reduce); //collect():收集把stream结果集转换为list或set ListString collectList EmploeeData.ListEmployees().stream().map(e - e.getName()).collect(Collectors.toList()); IteratorString iterator collectList.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } } }五Optional1.理解为了解决java中的空指针问题而生OptionalT类java.util.Optional是一个容器类它可以保存类的值代表这个值存在或者仅仅报错null表示这个值不存在原来用null 表示一个值不存在现在Optional可以更好的表达这个概念并且可以避免空指针2.常用方法Test public void test9(){ String strhello; //strnull; //1.of(T t):创建value为T类型的Optional类,且t不能为null OptionalString op1 Optional.of(str); //of()和get()搭配使用获取内部封装的数据 System.out.println(op1.get()); System.out.println(******************); //2.ofNullable(T t)创建value为T类型的Optional类,且可以为null strnull; //ofNullable()和orElse()搭配使用获取内部封装的数据 OptionalString op2 Optional.ofNullable(str); //如果Op2的value为null则str2的值为beijing String str2 op2.orElse(beijing); System.out.println(str2); }3.典型练习class Boy{ private Girl girl; public Girl getGirl() { return girl; } public void setGirl(Girl girl) { this.girl girl; } public Boy(Girl girl) { this.girl girl; } public Boy() { } } class Girl{ private String name; public Girl(String name) { this.name name; } public String getName() { return name; } public void setName(String name) { this.name name; } }// Optional 之前用法 public String getGirlName(Boy boy){ if(boy!null){ Girl girl boy.getGirl(); if(girl!null){ return girl.getName(); } return null; } return null; } Test public void test10(){ String girlName getGirlName(new Boy()); System.out.println(girlName); System.out.println(); Boy boy new Boy(new Girl(陈德容)); String girlName1 getGirlName(boy); System.out.println(girlName1); } // Optional 实现 public String getGirlName2(Boy boy){ OptionalBoy boyoptional Optional.ofNullable(boy); //boy1 一定非空 Boy boy1 boyoptional.orElse(new Boy(new Girl(迪丽热巴))); Girl girl boy1.getGirl(); OptionalGirl girl1 Optional.ofNullable(girl); //girl2 一定非空 Girl girl2 girl1.orElse(new Girl(古力娜扎)); String name girl2.getName(); return name; } Test public void test11() { Boy boy new Boy(new Girl(lily)); boynull; String name2 getGirlName2(boy); System.out.println(name2); } }