Lambda 表达式
- Lambda 表达式语法
Lambda 表达式语法包含三个部分:
- 参数列表:函数的入参。
- 箭头:把参数列表和 Lambda 主体分开。
- Lambda 主体:函数主要实现的功能
(String s1,String s2) -> s1.length().compareTo(s2.length());
其中,(String s1,String s2)
为参数列表,s1.length().compareTo(s2.length());
为Lambda主体。
Lambda 表达式的基本语法:
(parameters) -> expression
// 或者(请注意花括号)
(parameters) -> {statements;}
- Lambdas及函数式接口的例子
使用案例 | Lambdas例子 | 对应的函数式接口 |
---|---|---|
boolean 表达式 | List<String> list -> list.isEmpty() |
Predicate<List<String>> |
创建对象 | () -> new Apple(10) |
Supplier<Apple> |
消费对象 | (Apple a) -> System.out.println(a.getWeight()) |
Consumer<Apple> |
从一个对象中提取 | (String s) -> s.length() |
Function<String,Integer>或<ToIntFunction<String> |
- 方法引用
Lambda 及其等效方法方法引用示例
Lambda | 等效引用方法 |
---|---|
(Apple a) -> a.getWeight() |
Apple::getWeight |
() -> Thread.currentThread().dumpStack |
Thread.currentThread::dumpStack |
(String s) -> System.out.println(s) |
System.out::println |
Java8 引入流
- 流是什么
流是Java API的新成员,它允许你以声明的方式处理数据集合。可以把它们看作是遍历数据集的高级迭代器。
流使用样例:
List<String> names = menu.stream()
.filter(d -> d.getCalories() > 300)
.map(Dish::getName)
.limit(3)
.collect(toList());
该表达式的含义:过滤卡路里大于 300 的三盘菜
- 如何使用流
流的使用一般包含三件事
- 一个数据源。
- 中间操作,形成一个流的流水线
- 一个终端,生成结果。
- 流的中间操作
操作 | 类型 | 返回类型 | 操作函数 | 函数描述符 |
---|---|---|---|---|
filter | 中间 | Stream<T> | Predicate<T> | T -> boolean |
map | 中间 | Stram<T> | Function<T,R> | T -> R |
limit | 中间 | Stream<T> | ||
sort | 中间 | Steam<T> | Comparator<T> | (T,T) -> int |
distinct | 中间 | Steam<T> |
- 流的终端操作
操作 | 类型 | 目的 |
---|---|---|
forEach | 终端 | 消费流中的每一个元素并对其应用 Lambda,该操作返回 void |
count | 终端 | 返回流中的个数,该操作返回 long |
collect | 终端 | 把流归约成一个集合,如 List、Map甚至是 Integer |
- map使用
返回集合中每个字段的长度:
List<String> words = Arrays.asList("Hello","Word","Java 8","Lambdas","Actions");
List<Integer> wordLengths = words.stream().map(String::length).collect(Collectors.toList());
- 匹配
数据是否匹配条件
// 是否都匹配
boolean isHealthy = menu.stream().allMatch(d -> d.getCalories <1000);
// 确保没有匹配
boolean isHealthy = menu.stream().noneMatch(d -> d.getCalories>=1000);
- 计数
long count = list.stream().filter(s -> s.equals("A")).count();
- 取交集
List<String> updateData = param.stram().filter(all::contains).collect(Collectors.toList());
其中,all:["aaa","bbb", "ccc", "ddd", "eee"] ,param:["aaa", "ccc", "fff"]
- 取param的非交集
List<String> add = param.stream().filter(s ->!all.contains(s)).collect(Collectors.toList());