Java 8是Java语言的一个重要版本,它引入了许多新特性,其中Lambda表达式和Stream API是两个非常受欢迎的特性。Lambda表达式让Java代码更加简洁,而Stream API则提供了处理集合数据的新方法。下面,我们将通过一些实战案例,帮助你轻松上手这两个特性。
Lambda表达式
Lambda表达式是Java 8引入的一个特性,它允许我们以更简洁的方式编写匿名函数。在Java 8之前,我们需要使用匿名内部类来实现类似的功能,而Lambda表达式则提供了一种更简洁、更易于理解的方式。
1.1 Lambda表达式的语法
Lambda表达式的语法非常简单,它由三个部分组成:参数列表、箭头(->)和表达式体。
Runnable r = () -> System.out.println("Hello, World!");
r.run();
在上面的例子中,我们创建了一个Runnable的Lambda表达式,它没有参数,只有一个简单的打印语句。
1.2 Lambda表达式的应用
Lambda表达式可以用于任何可以使用匿名内部类的地方。以下是一些常见的应用场景:
- 排序
- 筛选
- 映射
- 计算值
Stream API
Stream API是Java 8引入的一个新的抽象层,它允许我们以声明式的方式处理集合数据。Stream API可以让我们更轻松地进行集合的遍历、转换、过滤和聚合等操作。
2.1 Stream的基本操作
Stream API提供了许多基本操作,如filter、map、flatMap、sorted、limit等。
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 过滤掉空字符串
strings.stream()
.filter(s -> !s.isEmpty())
.forEach(System.out::println);
在上面的例子中,我们使用filter操作过滤掉空字符串,然后使用forEach操作打印出剩余的字符串。
2.2 Stream的收集器
Stream API还提供了一些收集器,如collect、summarizingInt、averagingInt等,它们可以将Stream中的元素收集到不同的数据结构中。
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 计算非空字符串的平均长度
double average = strings.stream()
.filter(s -> !s.isEmpty())
.mapToInt(String::length)
.average()
.orElse(0.0);
System.out.println(average);
在上面的例子中,我们使用mapToInt将字符串映射到它们的长度,然后使用average计算平均长度。
实战案例
下面,我们将通过一个实战案例来展示如何使用Lambda表达式和Stream API。
3.1 案例背景
假设我们有一个学生类,包含学生的姓名、年龄和成绩。我们需要找出所有年龄大于18岁且成绩大于90分的学生。
3.2 实现步骤
- 创建学生类。
- 创建一个学生列表。
- 使用Stream API过滤出符合条件的学生。
- 打印出符合条件的学生信息。
class Student {
private String name;
private int age;
private int score;
public Student(String name, int age, int score) {
this.name = name;
this.age = age;
this.score = score;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public int getScore() {
return score;
}
}
public class Main {
public static void main(String[] args) {
List<Student> students = Arrays.asList(
new Student("Alice", 20, 95),
new Student("Bob", 18, 85),
new Student("Charlie", 19, 90),
new Student("David", 17, 80)
);
students.stream()
.filter(s -> s.getAge() > 18 && s.getScore() > 90)
.forEach(s -> System.out.println(s.getName() + " " + s.getAge() + " " + s.getScore()));
}
}
在上面的例子中,我们使用Stream API过滤出所有年龄大于18岁且成绩大于90分的学生,并打印出他们的信息。
总结
通过本文的介绍,相信你已经对Java 8的Lambda表达式和Stream API有了更深入的了解。这两个特性可以让你的Java代码更加简洁、易读,并提高代码的效率。希望你能将这些新特性应用到实际项目中,提高你的编程水平。
