达内javaSE_day08 学习笔记 —— lambda表达式
javaSE_day08
lambda表达式
-
函数式接口编程
接口中只有一个抽象方法,把方法通过匿名类实现的方式简化成一个表达式(lambda表达式)的写法。 -
语法格式:
() -> {}
() 表示形参列表
-> 符号 goes to
{} 表示方法体 -
如果只有一条语句,{ }可省略
eg:
/* IA a2 = ()-> {
System.out.println(“hello!!!”);
};*/
IA a2 = ()-> System.out.println(“hello!!!”); -
参数列表的数据类型可省略
eg:
/* IA2 a2 = (int x,int y)->{ //lambda表达式
System.out.println(x+y);
};*/
IA2 a2 = ( x, y)-> System.out.println(x+y); -
如果参数列表是一个参数,()可以省略
//IA2 a2 = x-> System.out.println(x+y); -
如果方法体中只有一条语句,return可以省略
eg:
/* IA3 a = (int x,int y)->{ //lambda表达式
return x+y;
};*/
IA3 a = (x,y)->x+y;
练习:
- 给定一个厨师接口Cook,内含唯一的抽象方法makeFood,且无参数, 无返回值。
使用Lambda的标准格式调用invokeCook方法,打印"吃饭啦!"
package cn.tedu.lambda;
interface Cook{
//输出 吃饭啦
void makeFood();
}
public class TestLambda {
public static void invokeCook(Cook cook) {
cook.makeFood();
}
public static void main(String[] args) {
invokeCook(new Cook() { //匿名类
@Override
public void makeFood() {
System.out.println("吃饭啦!");
}
});
invokeCook(()->System.out.println("吃饭啦!!")); //lambda表达式
}
}
2.定义接口
public interface Calculator {
//定义一个计算两个int整数和的方法并返回结果
int calc(int a,int b);
定义测试类
public class Demo01Calculator {
public static void main(String[] args) {
//调用invokeCalc方法,方法的参数使用匿名内部类
实现
//使用Lambda表达式简化匿名内部类的书写
}
public static void invokeCalc(int a,int b,Calculator c){
int sum = c.calc(a,b);
System.out.println(sum);
}
}
package cn.tedu.lambda;
interface Calculator{
int calc(int a,int b);
}
public class TestCalculator {
public static void invokeCalc(int a,int b,Calculator c) {
int sum = c.calc(a, b);
System.out.println(sum);
}
public static void main(String[] args) {
invokeCalc(1, 2, new Calculator() { //匿名内部类实现接口
@Override
public int calc(int a, int b) {
return a+b;
}
});
invokeCalc(2, 3,(a,b)->a+b); //lambda表达式
}
}
lambda表达式使用已定义方法
方法的参数相同,返回类型相同时才可用这种格式:
方法的归属者 : : 方法名
- 非静态:方法的归属者就是对象名;
- 静态:方法的归属者是类名
练习:
package cn.tedu.lambda;
/**
* 练习
* @author Dell
*
*/
interface IDemo{
//控制输出
void showMessage(String msg);
}
interface IDemo2{
//返回两个数的最大值:Math.max()
int max(int x,int y);
}
public class Demo5 {
/*public void showMessage(String msg) {
System.out.println(msg);
}
public static int max(int x,int y) {
return Math.max(x, y);
}*/
public static void main(String[] args) {
Demo5 demo = new Demo5();
/*IDemo demo1 = demo:: showMessage;
demo1.showMessage("123");
IDemo2 demo2 = Demo5::max;
System.out.println(demo2.max(1, 2));*/
IDemo demo1 = System.out:: println;
demo1.showMessage("123");
IDemo2 demo2 = Math::max;
System.out.println(demo2.max(1, 2));
}
}
Lambda对构造方法的引用
推荐阅读
-
C# Lambda表达式学习笔记
-
(C++11/14/17学习笔记):lambda表达式的使用
-
C# Lambda表达式学习笔记
-
达内javaSE_day10 学习笔记 —— String类、正则表达式
-
达内javaSE_day11 学习笔记 —— Math类、日期相关类、异常、IO流
-
达内javaSE_day08 学习笔记 —— lambda表达式
-
达内javaSE_day14学习笔记 —— 网络编程、模拟会话聊天室
-
达内javaSE_day05学习笔记 02 —— 面向对象、面向过程、类和对象
-
达内javaSE_day17 学习笔记 ——泛型、Stream、集合(List、Set、Map)
-
达内javaSE_day06 学习笔记 —— 对象的造型、关键字(static,final)