Java基础- Function接口

我们来看一个 Function 接口的例子。假设我们有一个任务,需要处理一个员工对象列表,将每个员工的信息格式化为字符串,同时根据一些规则(如年龄、工作年限等)来过滤员工。这个任务可以通过使用 Function 接口以及流(Streams)和Lambda表达式来实现。

示例:使用 Function 接口处理复杂逻辑

首先,定义一个员工类 Employee

public class Employee {
    private String name;
    private int age;
    private int yearsOfService;

    // 构造器、getter 和 setter 省略
}

现在,我们创建一个方法来处理员工列表,并格式化满足特定条件的员工信息:

import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

public class FunctionTest {
    public static void main(String[] args) {
        List<Employee> employees = Arrays.asList(
                new Employee("John Doe", 30, 5),
                new Employee("Jane Smith", 45, 20),
                new Employee("Kevin White", 28, 3)
        );

        // 创建一个 Function,它接受一个 Employee 对象并返回一个 String
        Function<Employee, String> employeeInfoFormatter = employee ->
                "Name: " + employee.getName() +
                        ", Age: " + employee.getAge() +
                        ", Years of Service: " + employee.getYearsOfService();

        // 处理员工列表:过滤、应用 Function 并收集结果
        List<String> formattedEmployees = employees.stream()
                .filter(employee -> employee.getYearsOfService() > 5) // 过滤条件:工作年限超过5年
                .map(employeeInfoFormatter) // 应用 Function
                .collect(Collectors.toList());

        // 输出结果
        formattedEmployees.forEach(System.out::println);
    }
}

程序输出为:

Name: Jane Smith, Age: 45, Years of Service: 20

在这个例子中:

  • 我们定义了一个 Function<Employee, String>,它接受一个 Employee 对象并返回一个格式化的字符串。
  • 使用 Java 流(Streams),我们先过滤出工作年限超过5年的员工。
  • 然后,我们使用 map 方法将 employeeInfoFormatter 应用于每个员工对象,将其转换成格式化的字符串。
  • 最后,我们收集结果并打印出来。

这个例子展示了如何将 Function 接口与 Java 8 引入的流和Lambda表达式相结合,来处理集合中的对象,并执行复杂的数据转换。这种方法提高了代码的可读性和可维护性,同时使代码更加简洁。


以上代码是 Java 8 引入的流(Stream)API 的一个例子,展示了如何使用流来处理集合。下面,我们逐步解释这段代码的各个部分:

1. 创建 Stream

employees.stream()
  • employees.stream():这里,employees 是一个 Employee 对象的列表。通过调用 stream() 方法,我们将这个列表转换成了一个流(Stream)。流是一系列支持顺序和并行聚合操作的元素。

2. 应用过滤(Filter)

.filter(employee -> employee.getYearsOfService() > 5)
  • .filter(...):这是一个中间操作,它接收一个 Predicate(在这里是一个 Lambda 表达式)。这个表达式为每个元素(在这个例子中是 Employee 对象)计算一个布尔值。
  • employee -> employee.getYearsOfService() > 5:这个 Lambda 表达式对于每个 employee,检查其 getYearsOfService() 返回的值是否大于 5。只有满足这个条件的元素才会被保留下来。

3. 应用映射(Map)

.map(employeeInfoFormatter)
  • .map(...):这也是一个中间操作,它接收一个 Function。这个函数对流中的每个元素应用一个操作。
  • employeeInfoFormatter:这是一个 Function 类型的实例,它将一个 Employee 对象转换为一个字符串。在这个例子中,它负责生成员工信息的格式化表示。

4. 收集结果(Collect)

.collect(Collectors.toList())
  • .collect(...):这是一个终端操作,它触发了流的处理。它接收一个 Collector,在这个例子中是 Collectors.toList()
  • Collectors.toList():这个方法收集流中的所有元素,并将它们组合成一个列表。
  • 最终,这个调用返回一个 List<String>,包含所有经过过滤和转换的员工信息。

总结

整个流程是这样的:从 employees 列表创建一个流,过滤掉服务年限不超过 5 年的员工,然后将剩余员工的信息通过 employeeInfoFormatter 函数转换成字符串,最后将这些字符串收集到一个新的列表中。这个流水线式的处理方式使得对集合的操作既高效又易于理解。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青衫客36

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值