java8 lambda表达式和函数式编程
什么是函数式接口(Functional Interface)
其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法 (可以有default, static方法)。
这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。
Your first Lambda expression
开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例。看一下Java 8之前的runnable实现方法,需要4行代码,而使用lambda表达式只需要一行代码。我们在这里做了什么呢?那就是用() -> {}代码块替代了整个匿名类。
// Java 8之前:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Before Java8, too much code for too little to do");
}
}).start();
//Java 8方式:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();
输出:
too much code, for too little to do
Lambda expression rocks !!
这个例子向我们展示了Java 8 lambda表达式的语法。你可以使用lambda写出如下代码:
(params) -> expression
(params) -> statement
(params) -> { statements }
例如,如果你的方法不对参数进行修改、重写,只是在控制台打印点东西的话,那么可以这样写:
() -> System.out.println("Hello Lambda Expressions");
如果你的方法接收两个参数,那么可以写成如下这样:
(int even, int odd) -> even + odd
顺便提一句,通常都会把lambda表达式内部变量的名字起得短一些。这样能使代码更简短,放在同一行。所以,在上述代码中,变量名选用a、b或者x、y会比even、odd要好。
因此总结一下的格式是
params=参数,your Code=你的代码,results=返回值
(params,params) -> {your Code}
如果只有一个参数或者一行代码的话 可以将括号省略掉,于是就变成了
params -> your Code
如果是有返回值是的话是
(params) -> {return results}
同样,这种return只有一行的话,也可以简写,例如
x -> x+1
这就等效于
(x) -> {return x+1}
example:
public class LambdaTest
{
public static void main(String args[]){
LambdaTest tester = new LambdaTest();
//with type declaration
MathOperation addition = (int a, int b) -> { return a + b; };
MathOperation addition1 = new MathOperation(){
@Override
public int operation(int a, int b)
{
// TODO Auto-generated method stub
return 0;
}};
//with out type declaration
MathOperation subtraction = (a, b) -> {return a - b;};
//with return statement along with curly braces
MathOperation multiplication = (int a, int b) -> { return a * b; };
//without return statement and without curly braces
MathOperation division = (int a, int b) -> a / b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
System.out.println("10 / 5 = " + tester.operate(10, 5, division));
//with parenthesis
GreetingService greetService1 = message -> System.out.println("Hello " + message);
//without parenthesis
GreetingService greetService2 = (message) -> System.out.println("Hello " + message);
greetService1.sayMessage("Mahesh");
greetService2.sayMessage("Suresh");
}
interface MathOperation {
int operation(int a, int b);
}
interface GreetingService {
void sayMessage(String message);
}
private int operate(int a, int b, MathOperation mathOperation){
return mathOperation.operation(a, b);
}
}
输出:
10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Mahesh
Hello Suresh
最新文章
- web安全相关知识
- 安卓gridview 网格,多行多列实现
- python 输出大文本文件
- MVC -- 后台RedirectToAction传递实体类与字符串
- oracle数据库函数之============‘’分析函数和聚合函数‘’
- HTML5的学习--performance获取加载时间的工具
- 把strassen乘法调出来了...
- Android典型界面设计——ViewPage+Fragment实现区域顶部tab滑动切换
- java树状结构之二叉树
- 用Python写的简单脚本更新本地hosts
- [置顶] 浏览器模式和标准对于javascript的影响
- 随手小代码——《Python编程 从入门到实践》项目1:外星人入侵
- Selenium在定位的class含有空格的复合类的解决办法整理
- Neutron:Firewall as a Service(FWaaS)
- Codeforces Round #549 (Div. 2) 训练实录 (5/6)
- Excel 导入时如何下载模板信息(Java)
- Linux之ssh登录
- hihoCoder #1037 : 数字三角形 (动态规划)
- String类——StringBuilder类的源码及内存分析(java)
- 师弟推荐软件-/mathpix
热门文章
- box-shadow详解
- Linux从入门到进阶全集——【第十五集:安装apache服务器】
- python + mysql 实现查询表数据
- .net core工具组件系列之Redis—— 第一篇:Windows环境配置Redis(5.x以上版本)以及部署为Windows服务
- PAT乙级:1061 判断题 (15分)
- python框架之Flask
- Windows10 64位解决无法使用Microsoft.Jet.OLEDB.4.0的方法
- Debian10 / Ubuntu 20.10 /Linux Mint 20安装Microsoft Edge浏览器Dev版(每周更新)
- HTTP协议GET方法传参最大长度理解误区
- video标签的视频全屏