在Java 8中引入的Lambda表达式和流(Stream)API为我们提供了强大的工具,用于简化集合操作,例如映射(mapping)和过滤(filtering)。本文将详细探讨如何使用Lambda表达式实现函数映射和过滤,并通过代码示例演示其应用。
Lambda表达式简介
Lambda表达式是一种简洁的方式来表示匿名函数,它允许我们以更简明的方式编写代码。Lambda表达式的基本语法如下:
```java (parameters) -> expression // 或者 (parameters) -> { statements; } ```
流(Stream)API简介
流API提供了一种声明性的方法来处理集合数据。流是元素的有序序列,可以进行聚合操作,如筛选、映射、减少等。流操作分为两类:
1. **中间操作**:返回一个新的流,例如`filter`、`map`。
2. **终端操作**:返回一个结果或副作用,例如`forEach`、`collect`。
实现函数映射和过滤
映射和过滤是流API中的两个常见操作,通常用于转换和选择集合中的元素。
1. 函数映射(Mapping)
映射操作用于将一个函数应用于每个元素,并将其转换为一个新的元素。`Stream`接口提供了`map`方法来实现这一点。
```java List<String> words = Arrays.asList("apple", "banana", "cherry"); List<Integer> wordLengths = words.stream() .map(String::length) .collect(Collectors.toList()); ```
在这个示例中,我们将一个字符串列表转换为其对应的长度列表。`map`方法接受一个函数,该函数将应用于流的每个元素。
2. 过滤(Filtering)
过滤操作用于选择符合某个条件的元素。`Stream`接口提供了`filter`方法来实现这一点。
```java List<String> words = Arrays.asList("apple", "banana", "cherry", "date"); List<String> longWords = words.stream() .filter(word -> word.length() > 5) .collect(Collectors.toList()); ```
在这个示例中,我们过滤掉了长度不大于5的单词,只保留了长度大于5的单词。`filter`方法接受一个谓词(predicate),该谓词用于测试每个元素是否符合条件。
综合示例
我们可以结合映射和过滤来解决更复杂的问题。假设我们有一个包含若干用户的列表,每个用户都有一个姓名和年龄。我们希望找出所有18岁以上的用户,并获取他们的姓名列表。
首先,我们定义一个简单的`User`类:
```java class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "User{name='" + name + "', age=" + age + '}'; } } ```
然后,我们可以使用流API来实现我们的需求:
```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class LambdaExample { public static void main(String[] args) { List<User> users = Arrays.asList( new User("Alice", 23), new User("Bob", 17), new User("Charlie", 19), new User("David", 15) ); // 过滤出18岁以上的用户,并获取他们的姓名 List<String> adultNames = users.stream() .filter(user -> user.getAge() >= 18) .map(User::getName) .collect(Collectors.toList()); System.out.println(adultNames); // 输出: [Alice, Charlie] } } ```
在这个示例中,我们首先创建了一个用户列表。然后,我们使用流API来执行以下操作:
1. 使用`filter`方法过滤出年龄大于或等于18的用户。
2. 使用`map`方法将每个用户对象转换为其姓名。
3. 使用`collect`方法将结果收集到一个列表中。
总结
Java 8中引入的Lambda表达式和流API极大地简化了集合操作,使得代码更加简洁和易读。通过Lambda表达式,我们可以轻松实现函数映射和过滤操作,从而以声明性方式处理集合数据。本文通过示例展示了如何使用Lambda表达式和流API进行映射和过滤,希望能帮助读者更好地理解和应用这些特性。