Java Lambda 表达式和Collector
在Java 8中引入了Lambda表达式和Stream API,使得对集合数据的操作变得更加灵活和简洁。除了Lambda表达式和Stream API外,Java 8还引入了Collector接口,可以实现对Stream的汇总操作。在本文中,我们将介绍Java中的Lambda表达式和Collector,以及如何结合它们来对集合数据进行汇总操作。
Lambda 表达式
Lambda 表达式是一个匿名函数,可以将方法作为参数传递给其他方法。Lambda 表达式的基本语法为:(参数列表) -> {表达式}
。例如,下面是一个Lambda表达式的例子:
Runnable runnable = () -> {
System.out.println("Hello, Lambda!");
};
在这个例子中,() -> {System.out.println("Hello, Lambda!");}
是一个Lambda表达式,它没有参数,执行的操作是打印出"Hello, Lambda!"。
Stream API
Stream API 是Java 8中引入的用于对集合数据进行流式操作的API。Stream API提供了一种更加简洁和函数式的方式来处理集合数据,例如过滤、映射、排序等操作。下面是一个使用Stream API进行过滤操作的例子:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evenNumbers); // 输出 [2, 4, 6, 8, 10]
在这个例子中,我们使用stream()
方法将集合数据转换为Stream,然后使用filter()
方法对偶数进行过滤,最后使用collect()
方法将结果收集为一个List。
Collector 接口
Collector 接口是Java 8中定义的用于汇总Stream数据的接口。Collector接口定义了对Stream数据进行收集、分组、聚合等操作的方法。在使用Collector时,通常会调用Collectors类中提供的静态方法来获取Collector实例。下面是一个使用Collector对集合数据进行分组操作的例子:
List<String> names = Arrays.asList("Alice", "Bob", "Cathy", "David", "Emily", "Frank");
Map<Integer, List<String>> groupedNames = names.stream()
.collect(Collectors.groupingBy(String::length));
System.out.println(groupedNames); // 输出 {3=[Bob], 4=[Alice, Cathy, Emily, Frank], 5=[David]}
在这个例子中,我们使用groupingBy()
方法对字符串集合进行分组,按照字符串的长度进行分组,最后将结果收集为一个Map。
综合应用
下面是一个综合应用的例子,我们从一个学生列表中筛选出成绩大于80分的学生,并按照性别进行分组:
class Student {
private String name;
private int score;
private String gender;
// 省略构造方法和getter/setter
}
List<Student> students = Arrays.asList(
new Student("Alice", 85, "female"),
new Student("Bob", 75, "male"),
new Student("Cathy", 90, "female"),
new Student("David", 80, "male"),
new Student("Emily", 95, "female")
);
Map<String, List<Student>> groupedStudents = students.stream()
.filter(s -> s.getScore() > 80)
.collect(Collectors.groupingBy(Student::getGender));
System.out.println(groupedStudents);
在这个例子中,我们定义了一个Student类,包含name、score和gender属性,然后从学生列表中筛选出成绩大于80分的学生,并按照性别进行分组。
流程图
flowchart TD;
Start --> InputData;
InputData --> LambdaExpression;
LambdaExpression --> StreamAPI;
StreamAPI --> CollectorInterface;
CollectorInterface --> End;
饼状图
pie
title 分数统计
"80分以下" : 20
"80-90分" : 30
"90分以上" : 50
在本文中,我们介绍了Java中的Lambda表达式和Collector接口,以及如何结合它们来对集