Java——lambda表达式和函数式接口

前言

Lambda表达式:jdk 8 引入的新特性

 (参数1,参数2) -> {   函数......  }

函数式接口: 只有一个未实现方法的接口

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
}    

函数作为方法的参数:实际就是用lambda表达式,快速实现函数式接口的“未实现的方法”
(入参个数得一样,返回值个数得一样)

 Function func = (t) ->  { return "t是"+t; }   // 相当于实现了”函数式接口Function“的apply方法
 // 问:为什么实现的是apply方法,而不是其他的?   
 // 答:注意看函数式接口的定义,”只有一个未实现方法“ !!!!!!!!!
   
 t.apply("2")    // 输出 t是2
 t.apply("1","2")  // 会报错,因为参数个数不一样

使用方式

1.正常使用

注意事项:
1.lambda表达式只能引用外部的final变量(也就是说不能修改外部变量)
2.lambda表达式可以创建局部变量

//静态方法引用, 如 Integer的parseInt(String s)
   Function<String,Integer> func1 = (t)->{ return Integer.parseInt((String) t); };
   func1.apply("123");  //输出123
//实例方法引用,如 str的substring
   Function<String,String> func2 = (t) -> { return str.substring(0,2); };
   func2.apply("1234"); //输出12
//构造方法引用,通过类名::new, 如 User的new
   Function<String,User> func3 = (t) -> { return new User(t); };
   func3.apply("名称123"); //这里调用了User的构造函数 User(String name)
   

2.简化方式 ( :: )

注意事项:
1.用来当作参数传递的函数,必须改为static的
2.上面的都能通过 :: 来简化(这里省略)

// 注意特例:
Function<Student,String> fun = Student::getName;
// 这里和之前说的完全不一样了:
//  首先,学生类的getName方法没有任何传参,和Function接口需要的1个入参不符,
//  讲道理是没法通过的,但是这里把入参设为 “Student”后,就愣是通过了!!!!!!
// 我的猜测是java检测到没有参数时,会把当前对象作为参数传进去!!!!!

优点:减少了重复代码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值