1 /**
2 *@authorgc3 * Lambda 表达式的基础语法:java8中引入一个新的操作符 "->" ,该操作符称为箭头操作符或lambda操作符4 * 箭头操作符将lambda拆分成两部分:5 * 左侧:lambda表达式的参数列表6 * 右侧:lambda表达式中所需执行的功能,即lambda体7 * 语法格式一:无参数,无返回值8 * () -> System.out.println("xxxxxx");9 * 语法格式二:有一个参数,无返回值10 * (x) -> System.out.println(xxxxxx);11 * 语法格式三:若只有一个参数,小括号可以省略不写12 * x -> System.out.println(x);13 * 语法格式四:有两个以上的参数,有返回值,并且lambda体中有多条语句 test414 * Comparator comparator = (x,y) -> {15 * System.out.println("函数式接口");16 * return Integer.compare(x, y);17 * };18 * 语法格式五:若lambda体中只有一条语句,则return和大括号都可以省略不写19 * Comparator comparator = (x,y) -> Integer.compare(x, y);20 * 语法格式六:lambda表达式的参数列表的数据类型可以省略不写,因为jvm编译器可以根据上下文推断出数据类型,即“类型推断”21 * (Integer x,Integer y) -> Integer.compare(x, y); == (x,y) -> Integer.compare(x, y);22 *23 * 左右遇一括号省(左边是一个参数或者右边只有一条语句), 左侧推断类型省(左边不需要显示指定类型)24 *25 * 二、lambda表达式需要函数式接口的支持26 * 函数式接口:接口中只有一个抽象方法的接口(这样才知道要动态替换哪个方法),可以使用 @FunctionalInterface 检查一下27 * 反而言之:jdk接口上有@FunctionalInterface注解的都是函数式接口28 */
29 public classTestLambda {30
31 @Test32 public voidtest1() {33 new Thread(newRunnable() {34 @Override35 public voidrun() {36 Runnable r1 = () -> System.out.println("hello lambda1");37 }38 }).start();39
40 //相当于实现接口Runable无参方法run的匿名实现类.这里的实现同上面的匿名类效果一样
41 Runnable r1 = () -> System.out.println("hello lambda2");42 newThread(r1).start();43 }44 @Test45 public voidtest2() {46 //这里因为是一个参数,所以左边的括号省略,右边是一个表达式,所以右边的大括号省略47 //Consumer是一个消费者型的函数式接口,其accept方法可以对接收到的数据进行处理。这里相当于实现其抽象方法accept
48 Consumer consumer = x ->System.out.println(x);49 consumer.accept("我很帅");50 }51
52 @Test53 public voidtest4() {54 //这里左边是两个参数,所以使用括号,右边是两条语句,使用大括号。这里是实现了Comparator接口的compare方法,用于collection排序操作
55 Comparator comparator = (x,y) ->{56 System.out.println("函数式接口");57 returnInteger.compare(x, y);58 };59 //这里是简写,效果同上
60 Comparator comparator2 = (x,y) ->Integer.compare(x, y);61 }62
63 //通过这里的两个lambda实现,可以发现函数式接口的方法是动态改变的,而且不用继续接口,不用匿名类,实现起来方便快捷
64 @Test65 public voidtest5() {66 //(x) -> (x + 1)是一个lambda表达式,功能是自增。67 //其相当于一个入参和返回值类型相同的函数,这里将其传给MyFun,可以作为函数式接口MyFun内方法getValue的实现。68 //可以理解为MyFun内方法getValue的实现变成了整数值自增然后返回
69 Integer result = operation(100, (x) -> (x + 1));70 //这里输出101
71 System.out.println(result);72 //这里同理,只是getValue的实现变成了自减,所以输出结果为99
73 System.out.println(operation(100, (x) -> (x - 1)));74 }75 public Integer operation(Integer num, MyFunmf) {76 returnmf.getValue(num);77 }78
79 List users =Arrays.asList(80 new User("gc", 24, 7500),81 new User("gc", 25, 13000),82 new User("gc", 26, 20000));83
84 @Test85 public voidtest6() {86 //这里第二个参数是lambda表达式,其实现了函数表达式式Comparator的compare方法
87 Collections.sort(users, (u1, u2) ->{88 return u1.getAge() -u2.getAge();89 });90 System.out.println(users);91 }92 @Test93 //对两个long型进行处理
94 public voidtest7() {95 //参数3是lambda,用于实现函数式接口。相当于MyFun2的getValue(a,b)功能变成了a+b
96 op(100L, 200L, (x,y) -> x +y);97 }98 public void op(Long t1, Long t2, MyFun2mf2) {99 System.out.println(mf2.getValue(t1, t2));100 }101 @Test102 public voidtest() {103 //这里是stream配合lambda表达式一起使用。stream这里简单理解为遍历list104 //(e) -> e.getSalary() >= 10000是函数式接口Predicate内方法test的实现,其功能是判断是否正确105 //下面这里就是判断list中的元素的salary是否大于10000,大于的继续往下处理106 //forEach就是遍历打印。这里总体的功能就是遍历list,打印salary大于10000的User
107 users.stream().108 filter((e) -> e.getSalary() >= 10000).forEach(System.out::println);109 users.stream().110 map((e) ->e.getName()).forEach(System.out::println);111 }112 }