使用Lambda表达式实现函数映射和过滤

简介: 使用Lambda表达式实现函数映射和过滤

在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进行映射和过滤,希望能帮助读者更好地理解和应用这些特性。

目录
相关文章
|
API Serverless 监控
函数组合的N种方式
随着以函数即服务(Function as a Service)为代表的无服务器计算(Serverless)的广泛使用,很多用户遇到了涉及多个函数的场景,需要组合多个函数来共同完成一个业务目标,这正是微服务“分而治之,合而用之”的精髓所在。
2343 0
|
1天前
多列组合作为判断依据的具体方法是什么?
通过以上方法,可以根据具体的业务需求和数据特点,灵活地选择以多列组合作为判断数据重复值的依据,从而更准确地处理和分析数据。
14 6
|
3月前
|
存储
访问者模式问题之在 extractFunctions 方法中, FunctionCallExpression 类型的 Expression如何处理
访问者模式问题之在 extractFunctions 方法中, FunctionCallExpression 类型的 Expression如何处理
|
4月前
|
Java 数据库连接 mybatis
Mybatis查询传递单个参数和传递多个参数用法
Mybatis查询传递单个参数和传递多个参数用法
64 11
|
6月前
|
C#
C#动态查询:巧用Expression组合多条件表达式
在C#中,利用`Expression`类和`AndAlso`、`OrElse`方法,可以组合两个`Expression&lt;Func&lt;T, bool&gt;&gt;`以实现动态多条件查询。该方法通过构建表达式树,方便地构建复杂查询。示例代码展示了如何创建表达式树,分别检查年龄大于等于18和姓名为&quot;John&quot;的条件,并使用`AndAlso`组合这两个条件,最终编译为可执行的委托进行测试。
251 1
|
Java
2.3 Lambda表达式在集合操作中的应用:对集合元素进行映射和转换
2.3 Lambda表达式在集合操作中的应用:对集合元素进行映射和转换
163 0
|
存储 Java
2.2 Lambda表达式在集合操作中的应用:过滤和筛选集合元素
2.2 Lambda表达式在集合操作中的应用:过滤和筛选集合元素
685 0
|
JSON JavaScript 数据格式
根据多种条件过滤对象的JSON数组
根据多种条件过滤对象的JSON数组
114 0
|
前端开发
Less预处理——继承、导入、条件表达式和函数
Less预处理——继承、导入、条件表达式和函数
310 0
MybatisPlus条件构造器 多个组合OR嵌套拼接写法
MybatisPlus条件构造器 多个组合OR嵌套拼接写法
689 0