# 集合 Lambda表达式
语言:
适合做服务器开发:JAVA .net pht c++ c# asp golang python…
前端:ios android H5 jsp…
数据库:mysql oracle BD2 Hbase MonggoDB redis ,sql sever…
大数据:hadoop flume spark hive yarn zonokeeprer kafka sqoop,HDFS mr,scala…
Lambda表达式:
只有一个抽象方法的接口,java8的新特性,java可以函数式编程,在并发性能上迈出了实质性的一步。
比较Lambda和匿名内部类(lambda是简单的匿名内部类)
1. 匿名内部类可以为任意接口创建实例,不管接口包含多少个抽象方法,只要匿名内部类实现所有的抽象方法即可; 但Lambda表达式只能为函数式接口创建实例(即只能有一个抽象方法)
2. 匿名内部类可以为抽象类甚至是普通类创建实例;但Lambda表达式只能为函数式接口创建实例
3. 匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认(default)方法;但Lambda表达式的代码块不允许调用接口中的默认(default)方法
基本语法
1.构成:(参数)->表达式 or (参数)->{方法体;}
2.形参列表:形参列表允许省略形参类型,若形参列表中只有一个参数,形参列表的圆括号也可以省略代码
3.箭头(->):必须通过英文的划线号和大于符号组成
4.代码块:如果代码块只包含一条语句,lambda表达式允许省略代码块的花括号,那么这条语句就不要用花括号表示语句结束
5.返回值:lambda代码块只有一条return语句,甚至可以省略return关键字。(lambda表达式需要返回值,而它的代码块中仅有一条省略了return的语句,lambda表达式会自动返回这条语句的结果)
6.lambda表达式可以直接作为函数的参数,当要实现只有一个接口的抽象函数时,使用lambda表达式能够更灵活。
7.lambda表达式类型:它的定义是:一个接口,如果只有一个显式声明的抽象方法,那么它就是一个函数接口。一般用@FunctionalInterface标注出来 (也可以不标记),函数式接口可以
包含多个default或static方法,但是只能声明一个抽象方法。(注解)@FuctionalInterface主要作用就是检查当前接口是不是函数接口。
8.如果是全局的变量直接用.如果是局部变量会被默认在前面添加final(被作为常量,类似于局部变量在局部内部类中使用的情况)
方法引用与构造器引用
1.引用类方法
//* 1.引用类方法
interface Converter{
//将字符串转换成整数
Integer convert(String value);
}
class Test1{
public static void fun1() {
//原来的方法
Converter converter = value->Integer.valueOf(value);
Integer v1 = converter.convert("222");
System.out.println(v1);
//简化
//引用类方法
//通过::实现,这里会自动将lambda表达式方法的参数全部传递给当前的方法
Converter converter2 = Integer::valueOf;
Integer v2 = converter2.convert("333");
System.out.println(v2);
}
}
2.引用特定对象的实例方法
//* 2.引用特定对象的实例方法
interface IA{
public void show(String message);
}
class A{
public void play(String i) {
System.out.println("这里是A的方法play"+" i:"+i);
}
}
class Test2{
public static void fun2() {
//原来
IA ia = message->new A().play(message);
ia.show("hello");
//简化
IA ia2 = new A()::play;
ia2.show("world");
}
}
3.引用某类对象的实例方法
//* 3.引用某类对象的实例方法
interface IB{
String subString(String string,int stat,int end);
}
class Test3{
public static void fun3() {
//原来
IB ib = (string,stat,end)->string.substring(stat, end);
String sub1 = ib.subString("hello world", 2, 4);
System.out.println(sub1);