什么是函数式接口(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



最新文章

  1. web安全相关知识
  2. 安卓gridview 网格,多行多列实现
  3. python 输出大文本文件
  4. MVC -- 后台RedirectToAction传递实体类与字符串
  5. oracle数据库函数之============‘’分析函数和聚合函数‘’
  6. HTML5的学习--performance获取加载时间的工具
  7. 把strassen乘法调出来了...
  8. Android典型界面设计——ViewPage+Fragment实现区域顶部tab滑动切换
  9. java树状结构之二叉树
  10. 用Python写的简单脚本更新本地hosts
  11. [置顶] 浏览器模式和标准对于javascript的影响
  12. 随手小代码——《Python编程 从入门到实践》项目1:外星人入侵
  13. Selenium在定位的class含有空格的复合类的解决办法整理
  14. Neutron:Firewall as a Service(FWaaS)
  15. Codeforces Round #549 (Div. 2) 训练实录 (5/6)
  16. Excel 导入时如何下载模板信息(Java)
  17. Linux之ssh登录
  18. hihoCoder #1037 : 数字三角形 (动态规划)
  19. String类——StringBuilder类的源码及内存分析(java)
  20. 师弟推荐软件-/mathpix

热门文章

  1. box-shadow详解
  2. Linux从入门到进阶全集——【第十五集:安装apache服务器】
  3. python + mysql 实现查询表数据
  4. .net core工具组件系列之Redis—— 第一篇:Windows环境配置Redis(5.x以上版本)以及部署为Windows服务
  5. PAT乙级:1061 判断题 (15分)
  6. python框架之Flask
  7. Windows10 64位解决无法使用Microsoft.Jet.OLEDB.4.0的方法
  8. Debian10 / Ubuntu 20.10 /Linux Mint 20安装Microsoft Edge浏览器Dev版(每周更新)
  9. HTTP协议GET方法传参最大长度理解误区
  10. video标签的视频全屏