java lambda函数_java8 lambda表达式和函数型接口

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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值