我们来看一个 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
对象并返回一个格式化的字符串。map
方法将 employeeInfoFormatter
应用于每个员工对象,将其转换成格式化的字符串。这个例子展示了如何将 Function
接口与 Java 8 引入的流和Lambda表达式相结合,来处理集合中的对象,并执行复杂的数据转换。这种方法提高了代码的可读性和可维护性,同时使代码更加简洁。
以上代码是 Java 8 引入的流(Stream)API 的一个例子,展示了如何使用流来处理集合。下面,我们逐步解释这段代码的各个部分:
employees.stream()
employees.stream()
:这里,employees
是一个 Employee
对象的列表。通过调用 stream()
方法,我们将这个列表转换成了一个流(Stream)。流是一系列支持顺序和并行聚合操作的元素。.filter(employee -> employee.getYearsOfService() > 5)
.filter(...)
:这是一个中间操作,它接收一个 Predicate
(在这里是一个 Lambda 表达式)。这个表达式为每个元素(在这个例子中是 Employee
对象)计算一个布尔值。employee -> employee.getYearsOfService() > 5
:这个 Lambda 表达式对于每个 employee
,检查其 getYearsOfService()
返回的值是否大于 5。只有满足这个条件的元素才会被保留下来。.map(employeeInfoFormatter)
.map(...)
:这也是一个中间操作,它接收一个 Function
。这个函数对流中的每个元素应用一个操作。employeeInfoFormatter
:这是一个 Function
类型的实例,它将一个 Employee
对象转换为一个字符串。在这个例子中,它负责生成员工信息的格式化表示。.collect(Collectors.toList())
.collect(...)
:这是一个终端操作,它触发了流的处理。它接收一个 Collector
,在这个例子中是 Collectors.toList()
。Collectors.toList()
:这个方法收集流中的所有元素,并将它们组合成一个列表。List<String>
,包含所有经过过滤和转换的员工信息。整个流程是这样的:从 employees
列表创建一个流,过滤掉服务年限不超过 5 年的员工,然后将剩余员工的信息通过 employeeInfoFormatter
函数转换成字符串,最后将这些字符串收集到一个新的列表中。这个流水线式的处理方式使得对集合的操作既高效又易于理解。