Lambda 表达式
1-函数式编程思想
Lambda表达式是函数式编程思想的体现
函数式编程思想:更在意过程,并不在意实现的形式;
面向对象编程思想:一切动作都通过对象来实现。
2-Lambda基本介绍
2.1-Lambda表达式的格式
() -> {}
-
()
:接口中唯一要实现的方法的形参列表 -
->
:指向需要需要执行的代码块(函数体),读作: goes to -
{}
: 代码块,也叫方法体或者函数体传统匿名内部类实现线程
/** * @author Object(object_hui@sina.com) * @description Lambda格式 * @date 2020/9/18 */ public class Lambda { public static void main(String[] args) { //使用内部方法实现线程接口Runnable,创建了线程 Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("一个内部类线程被创建了!~"); } }); thread.start(); } }
使用Lambda表达式实现线程
/** * @author Object(object_hui@sina.com) * @description Lambda格式 * @date 2020/9/18 */ public class Lambda { public static void main(String[] args) { //使用Lambda表达式 ,实现接口方法格式为: ()->{} Thread thread1 = new Thread(() -> {System.out.println("一个Lambda线程被创建了!~");}); thread1.start(); } }
2.2-Lambda表达式使用的前提
-
有一个接口
-
接口中有且只有一个抽象方法
小案例
使用lambda表达式调用自己创建的接口中的方法
//定义一个接口,接口只有一个抽象方法 public interface Eatable { void eat(String s); }
/** * @author Object(object_hui@sina.com) * @description Eatable测试类 * @date 2020/9/17 */ public class EatableDemo { public static void main(String[] args) { //使用Lambad 方法调用runEat()方法 runEat((String s) - > {System.out.println("我喜欢吃"+s);}); } public static void runEat(Eatable e){ e.eat("西红柿炒蛋"); } }
2.3-Lambda表达式的省略模式
-
参数类型可以省略,但需要同时省略形参列表所有参数的参数类型
-
如果参数只有一个,小括号可以省略不写
-
如果代码块中只有一条语句,大括号和分号可以不写
-
如果代码块中只有一个return语句,省略大括号和分号同时需要把return省略
//定义一个接口,接口只有一个抽象方法,只有一个参数,无返回值
public interface Eatable {
void eat(String name);
}
//定义一个接口,接口只有一个抽象方法,2个参数,无返回值
public interface Eatable01 {
void eat(String food,String name);
}
//定义一个接口,接口只有一个抽象方法,2个参数,有返回值
public interface Eatable02 {
String eat(String food,String name);
}
/**
* @author Object(object_hui@sina.com)
* @description Eatable测试类
* @date 2020/9/17
*/
public class EatableDemo {
public static void main(String[] args) {
//使用不省略 Lambad 方法调用runEat()方法
runEat((String name) - > {System.out.println(name);});
}
//接口只有一个参数,小括号可以省略,只有一条语句,大括号和分号可以省略
runEat( name - > System.out.println(name));
}
//接口只有多个参数,小括号不可以省略,只有一条语句,大括号和分号可以省略
runEat( (food, name) - > System.out.println(name+food));
}
//接口只有多个参数,只有一条return语句,省略写法
runEat( (food, name) - > name+food);
}
public static void runEat(Eatable e){
e.eat("西红柿炒蛋");
}
public static void runEat01(Eatable e){
e.eat("西红柿炒蛋","张三");
}
public static String runEat02(Eatable e){
e.eat("西红柿炒蛋","张三");
}
}
3-Lambda与匿名内部类的区别
-
内部类:通用,可以用于接口、抽象类、普通类的实现。
-
Lambda:只适用接口,并且接口中只能有一个抽象方法。
案例:
通过Lambda表达式获取接口对象,通过对象调用接口中的方法
//定义一个接口,接口只有一个抽象方法
public interface Eatable {
void eat(String food);
}
/**
* @author Object(object_hui@sina.com)
* @description Eatable测试类
* @date 2020/9/17
*/
public class EatableDemo {
public static void main(String[] args) {
//使用Lambad 先获取接口的对象
Eatable e = (String food) -> {System.out.println("我喜欢吃"+food);};
}
//通过对象调用接口方法
e.eat("西红柿炒鸡蛋")
}
}
4-Lambda支持引用的方法
4.1-常见的引用方式
-
引用类方法:引用类中的静态方法
格式:
类名::静态方法名
//接口,将字符串转换为int public interface ToInt { int change(String s); }
/** * @author Object(object_hui@sina.com) * @description 字符串转int测试类 * @date 2020/9/19 */ public class ToIntDemo { public static void main(String[] args) { //正常lambda写法 runChange((String s) -> Integer.parseInt(s)); //使用引用类型替代写法 runChange(Integer::parseInt); } public static void runChange(ToInt ti){ int num = ti.change("6666"); System.out.println(num); } }
-
引用对象的实例方法
格式:
对象名::成员方法名
//接口,将字符串转换为int public interface ToInt { int change(String s); }
/** * @author Object(object_hui@sina.com) * @description 实现字符串转数字方法的类 * @date 2020/9/19 */ public class ToIntClass { public int toInt(String s){ return Integer.parseInt(s); } }
/** * @author Object(object_hui@sina.com) * @description 字符串转int测试类 * @date 2020/9/19 */ public class ToIntDemo { public static void main(String[] args) { //正常lambda写法 runChange((String s) -> Integer.parseInt(s)); //使用对象引用实例方法替代lambda runChange(new ToIntClass()::toInt); } public static void runChange(ToInt ti){ int num = ti.change("6666"); System.out.println(num); } }
-
引用类的实例方法:
格式:
类名::方法名
public interface SubString { String subString(String str,int start, int end); }
/** * @author Object(object_hui@sina.com) * @description 引用类的实例方法测试类 * @date 2020/9/19 */ public class SubStringDemo { public static void main(String[] args) { //lambda表达式写法 subStringTest((String str,int start,int end) -> str.substring(start,end)); //采用了类的实例方法引用替代Lambda表达式 subStringTest(String::substring); } public static void subStringTest(SubString s){ System.out.println(s.subString("Hello World!~", 6, 11)); } }
-
引用构造方法
格式:
类名::new
/** * @author Object(object_hui@sina.com) * @description 学生类 * @date 2020/9/19 */ public class Student { private String name; private Integer age; public Student() { } public Student(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
/** *功能描述 创建学生类的接口 * @author Object */ public interface StudentBuild { Student bulidStudent(String name,Integer age); }
/** * @author Object(object_hui@sina.com) * @description 引用构造方法替代lambda * @date 2020/9/19 */ public class StudentDemo { public static void main(String[] args) { //使用lambda表达式调用创建学生对象方法 bulidStudent((String name,Integer age) -> new Student(name,age)); //使用构造方法替代lambda表达式 bulidStudent(Student::new); } private static void bulidStudent(StudentBuild sb){ System.out.println(sb.bulidStudent("张三", 23)); } }