1 Lambda表达式
-
lambda表达式可以理解为对匿名内部类的一种简化 , 但是本质是有区别的
-
面向对象思想 :
-
强调的是用对象去完成某些功能
-
-
函数式编程思想 :
-
强调的是结果 , 而不是怎么去做
-
1 函数式接口
-
只有一个抽象方法需要重写的接口,函数式接口。函数式接口是允许有其他的非抽象方法的存在例如静态方法,默认方法,私有方法。
-
为了标识接口是一个函数式接口,可以在接口之上加上一个注解: @FunctionalInterface 以示区别
-
在JDK中 java.util.function 包中的所有接口都是函数式接口。我们之前学习线程时学习的Runnable也是函数式接口
2 Lambda表达式的使用
-
使用前提
-
必须存在一个接口
-
接口中有且只有一个抽象方法
-
-
格式 : ( 形式参数 ) -> { 代码块 }
-
形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可
-
->:由英文中画线和大于符号组成,固定写法。代表指向动作
-
代码块:是我们具体要做的事情,也就是以前我们写的方法体内容
-
2-举例
1. 使用 Lambda 表达式实现一个简单的函数式接口
假设有一个函数式接口 GreetingService
,它只包含一个抽象方法 sayMessage
:
@FunctionalInterface
interface GreetingService {void sayMessage(String message);
}
使用 Lambda 表达式来实例化该接口:
public class LambdaExample {public static void main(String[] args) {// 使用 Lambda 表达式实现 GreetingService 接口GreetingService greetService = message -> System.out.println("Hello " + message);// 调用函数式接口的方法greetService.sayMessage("World");}
}
2. 使用 Lambda 表达式对集合进行迭代操作
假设有一个字符串列表,我们想要打印出列表中每个字符串的内容:
import java.util.Arrays;
import java.util.List;public class LambdaExample {public static void main(String[] args) {List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");// 使用 Lambda 表达式对集合进行迭代names.forEach(name -> System.out.println("Hello, " + name));}
}
3. 使用 Lambda 表达式实现多线程
通过 Lambda 表达式可以简化线程的创建和管理:
public class LambdaExample {public static void main(String[] args) {// 使用 Lambda 表达式创建一个新线程new Thread(() -> System.out.println("Hello from thread!")).start();}
}
4. 使用 Lambda 表达式进行条件过滤
假设有一个整数列表,我们想要筛选出所有的偶数:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class LambdaExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 使用 Lambda 表达式进行条件过滤List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());System.out.println("Even numbers: " + evenNumbers);}
}
Lambda 表达式通过简洁的语法和函数式接口的支持,使得 Java 编程在处理集合操作、事件处理等方面变得更加灵活和高效。