前言
今天讲一下这个困惑我很久的Lambda
。为什么这么说呢?因为我之前一直没主动去学过Lambda。很多使用Lambda表达式的代码我都没有仔细去琢磨咋回事。但是最近这个Lambda表达式出现的有些频繁,有点影响我接下来的学习了,于是我就去学了一下。我也是刚学完就来总结了,也算是巩固一下。当然我也希望这篇文章能帮到更多准备学Lambda同学。
这篇文章我会用很多通俗易懂的例子来教大家如何使用Lambda,建议大家自己也敲一遍案例,这样印象才会更加深刻!!
ps:本文中使用的所有例子为 一个接口,下面对应的Lambda实现 以及精简后的Lambda实现
Lambda表达式
使用须知
Lambda表达式虽然可以对接口进行简单的实现,但是这些接口必须只有一个抽象方法!!
。这里有个注解我给大家说明一下:@FunctionalInterface
这个注解是用在接口上面(修饰函数式接口),一旦使用了这个注解,那么这个接口中只能有一个抽象的方法。
基础语法和语法精简
():用来描述参数列表
{}:用来描述方法体 有时可以省略
->: Lambda运算符 读作 goes to
- 无参无返回类型接口的实现(方法大括号精简)
/**
*函数式接口
*/
@FunctionalInterface//修饰函数式接口(接口中的抽象方法只能有一个)
public interface NoneReturnNoneParmeter {
void test();
}
--------------------------------------------------------------
//使用Lambda表达式实现接口:
NoneReturnNoneParmeter lambda1=()->{
System.out.println("hello word");
};
--------------------------------------------------------------
//精简Lambda表达式:
/**
* 方法大括号精简:
* 如果方法体中只有一条语句,此时大括号可以省略
*/
NoneReturnNoneParmeter lambda1=()->System.out.println("hello word");
- 有返回值、一个参数的接口(小括号的精简、大括号精简的补充)
/**
*函数式接口
*/
@FunctionalInterface
public interface SingleReturnSingleParmeter{
int test(int a);
}
--------------------------------------------------------------
//使用Lambda表达式实现接口:
SingleReturnSingleParmeter lambda3=(int a)->{
return a*2;
};
--------------------------------------------------------------
//精简Lambda表达式:
/**
* 参数小括号
* 如果参数列表中,参数的数量只有一个 此时小括号可以省略
*/
SingleReturnSingleParmeter lambda3=a->{
return a*2;
}
--------------------------------------------------------------
/**
* 大括号精简补充:
* 如果方法体中唯一的一条语句是一个返回语句
* 则省略大括号的同时 也必须省略return
*/
SingleReturnSingleParmeter lambda3 a->a*2;
- 无返回值、多个参数的接口
/**
*函数式接口
*/
@FunctionalInterface
public interface NoneReturnMutipleParmeter {
void test(int a,int b);
}
--------------------------------------------------------------
//使用Lambda表达式实现接口:
NoneReturnMutipleParmeter lambda2=(int a,int b)->{
System.out.println("hello word");
};
--------------------------------------------------------------
//精简Lambda表达式:
/**
* 参数类型
* 由于在接口的抽象方法中,已经定义了参数的数量类型
* 所以在Lambda表达式中参数的类型可以省略
* 备注:如果需要省略类型,则每一个参数的类型都要省略
* 千万不要一个省略一个不省略
*/
NoneReturnMutipleParmeter lambda2=(a,b)->
System.out.println("hello word");
进阶(引用方法)
/**
*函数式接口
*/
@FunctionalInterface
public interface SingleReturnSingleParmeter{
int test(int a);
}
/**
*方法引用:
* 注意:
* 1.引用的方法中,参数数量和类型一定要和接口中定义的方法一致
* 2.返回值的类型也一定要和接口中的方法一致
*/
public class Syntax {
/**
* 自定义的实现方法
*/
private static int change(int a){
return a*2;
}
/**
*普通的引用
*/
SingleReturnSingleParmeter lambda1=a->a*2;
//简化:可以快速的将一个Lambda表达式的实现指向一个已经实现的方法
SingleReturnSingleParmeter lambda4=a->change(a);
/**
* 方法的隶属者 如果是静态方法 隶属的就是一个类 其他的话就是隶属对象
* 语法:方法的隶属者::方法名
*/
SingleReturnSingleParmeter lambda5=Syntax3::change;
}