思想概述
面向对象思想: 通过对象的属性和行为来描述事物,强调找对象并与之交互。
函数式编程思想: 通过函数(方法)来解决问题,关注方法的使用和结果。
面向对象思想写代码
- 传统方法
new Thread(new Runnable() { @Override public void run() { System.out.println("hello world"); } }).start();
- 使用lambda简化
new Thread(() -> System.out.println("hello world")).start();
Lambda表达式的使用场景
为了简化接口的实现。在某些情况下,我们需要为接口定义实现类或使用匿名内部类来实现接口的抽象方法,但Lambda表达式提供了一种更简单的方式来实现接口
下面是一个示例代码:
package test; public class Test04 { public static void main(String[] args) { // 使用Lambda表达式实现接口 Test test = () -> { System.out.println("test"); }; test.test(); } } interface Test { void test(); }
Lambda表达式对接口的要求
Lambda表达式并不是适用于所有接口的,它只适用于函数式接口。
- 函数式接口是指接口中只包含一个抽象方法的接口。Lambda表达式可以简化对这种接口的实现。
// 函数式接口 interface Test { void test(); }
Lambda表达式的语法
Lambda表达式格式
Lambda表达式格式:(参数类型 参数名称) -> {方法体}
在Lambda表达式中,我们只需要关注两个部分:参数列表和方法体。
- 参数部分:与接口中定义的抽象方法的参数列表保持一致,包括参数的数量和类型。
方法体部分:实现接口方法的具体逻辑。如果接口方法有返回值,要注意返回值的处理。
下面是不同类型的Lambda表达式示例:
// 无参 Test test1 = () -> { System.out.println("test"); }; // 有参,无返回值 Test test2 = (name, age) -> { System.out.println(name + age + "岁了!"); }; // 有参,有返回值 Test test3 = (name, age) -> { System.out.println(name + age + "岁了!"); return age + 1; };
Lambda表达式的进阶语法
参数部分的精简
- Lambda表达式中的参数类型可以省略,因为接口方法已经定义了参数类型。
注意:如果省略参数类型,所有参数的类型都必须省略。
// 有参,有返回值 Test test = (name, age) -> { System.out.println(name + age + "岁了!"); return age + 1; };
参数的小括号
- 当接口方法只有一个参数时,参数列表的小括号可以省略,但同时也必须省略参数的类型。
// 一个参数 Test test = name -> { System.out.println(name + "test"); };
方法体部分的精简
- 如果方法体中逻辑只有一句语句,大括号可以省略。
Test test = name -> System.out.println(name + "test");
return的精简
- 如果方法体中只有一个返回语句,大括号和return可以同时省略。
Test test = (a, b) -> a + b;
函数引用
- Lambda表达式的目的是简化接口的实现。如果Lambda表达式中的逻辑过于复杂,会影响代码的可读性。在这种情况下,可以将逻辑复杂的部分单独编写为方法,并通过函数引用来替代Lambda表达式实现接口的方法。
- 函数引用允许引用已存在的方法,从而代替Lambda表达式
静态方法的引用
- 静态方法的引用语法:类名::静态方法
注意:在引用静态方法时,不要添加小括号。引用的方法参数和返回值必须与接口方法一致。
class Calculator { public static int calculate(int a, int b) { // 复杂的逻辑 return Math.abs(a - b); } } interface Test1 { int test(int a, int b); } // 引用静态方法 Test1 test1 = Calculator::calculate;
非静态方法的引用
- 非静态方法的引用语法:对象::非静态方法。
注意:在引用非静态方法时,也不要添加小括号。引用的方法参数和返回值必须与接口方法一致。
class Calculator { public int calculate(int a, int b) { // 复杂的逻辑 return Math.abs(a - b); } } interface Test2 { int calculate(int a, int b); } // 引用非静态方法 Test2 test2 = new Calculator()::calculate;
构造方法的引用
- 构造方法的引用可以用于简化获取对象的操作。语法:类名::new。
注意:可以根据接口方法的参数来区分引用不同的构造方法。
class Student { String name; int age; public Student() { System.out.println("一个Student对象通过无参构造被实例化了"); } public Dog(String name, int age) { System.out.println("一个Student对象通过有参构造被实例化了"); this.name = name; this.age = age; } }
后记 👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹