什么是Lambda表达式
- JDK8开始支持Lambda表达式,用来让程序编写更优雅
- 利用Lambda可以更简洁的实现匿名内部类与函数声明与调用
- 基于Lambda提供stream流式处理极大简化对集合的操作
实例讲解Lambda语法
代码语言:javascript
复制(参数列表) -> 实现语句
- Lambda 标准使用方式
代码语言:javascript
复制Object obj = (Integer a, Integer b) -> {
return a b 0f;
}
System.out.println(obj.operate(1, 2));
- Lambda允许忽略参数类型
代码语言:javascript
复制Object obj = (a, b) -> {
return a b 0f;
}
System.out.println(obj.operate(3, 4));
- 单行实现代码可以省略大括号和return
代码语言:javascript
复制Object obj = (a, b) -> a * b 0f;
System.out.println(obj.operate(3, 5));
约束条件
- Lambda 表达式只能实现有且只有一个抽象方法的接口,Java称为“函数式接口”。
基于Lambda实现函数式编程
- 函数式编程理念是将代码作为可重用数据代入到程序运行中
- 函数式编程强调"你想做什么",而不是"你想怎么做"
- JDK8后提供了一系列新的函数式接口,位于java.util.function
Predicate
- Predicate是新增的函数式接口,位于java.util.function
- Predicate用于测试传入数据是否满足判断要求
- Predicate接口需要实现test()方法进行逻辑判断
Stream流式处理
- Stream流式处理是建立在Lambda基础上的多数据处理技术
- Stream对集合数据处理进行高度抽象,极大简化代码量
- Stream可对集合进行迭代,去重,筛选,排序,聚合等一系列处理
- 基于数组创建
代码语言:javascript
复制public void generator1() {
String[] arr = {"Lily", "Andy", "Jackson", "Smith"};
Stream<String> stream = Stream.of(arr);
stream.forEach(s -> System.out.println(s));
}
- 基于集合创建
代码语言:javascript
复制public void generator2() {
List<String> list = new ArrayList<>();
list.add("Lily");
list.add("Andy");
list.add("Jackson");
list.add("Smith");
Stream<String> stream = list.stream();
stream.forEach(s -> System.out.println(s));
}
- 利用generator创建无线长度流
代码语言:javascript
复制public void generator3() {
Stream<Integer> stream = Stream.generate(() -> new Random().nextInt(10000));
stream.limit(10).forEach(i -> System.out.println(i));
}
- 基于迭代器创建流
代码语言:javascript
复制public void generator4() {
Stream<Integer> stream = Stream.iterate(1, n -> n 1);
stream.limit(100).forEach(s -> System.out.println(s));
}
- 基于字符串系列创建流
代码语言:javascript
复制public void generator5() {
String str = "abcdefg哈喽";
IntStream stream =str.chars();
stream.forEach(c -> System.out.println((char)c));
}