【发布时间】:2022-11-23 01:19:52
【问题描述】:
给出以下任务。我们有一个 Employee 和一个 Company 类。 Employee类的每个实例都存储在Company类的数组Employee[] employees中。我需要一个方法来删除 id 数组 Employee[] employees 中的 Employee 实例。
我设法编写了以下代码:
public class Employee {
protected final int id;
protected String name;
public Employee(int id, String name) {
this.id = id;
this.name= name;
}
public int getId() {
return id;
}
}
public class Company {
private Employee[] employees;
private int size;
private static final int defaultCapacity = 5;
public Company() {
this(defaultCapacity);
}
public Company(int capacity) {
if (capacity <= 0)
throw new RuntimeException("capacity is required");
employees = new Employee[capacity];
}
public Employee removeEmployee(int id) {
Collection<Employee> employeeList = Arrays.asList(employees)
.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
Employee[] employeeArray = employeeList.toArray(Employee[]::new);
for (int i = 0; i < size; i++) {
if(employeeArray[i].getId() == id) {
Employee removedEmployee = employees[i];
employeeList.remove(employeeArray[i]);
employees = employeeList
.stream()
.filter(Objects::nonNull)
.toArray(Employee[]::new);
return removedEmployee;
}
}
return null;
}
}
问题是,如果找不到要删除的元素,我的方法 public Employee removeEmployee(int id) 将抛出 NullPointerException。
问题:
- 我如何重写方法
public Employee removeEmployee(int id),例如,使用 Streams API 和 Optional 以去除方法public Employee removeEmployee(int id)中的 NullPointerException?注意:在成功删除元素后,必须减少在类
Company中声明的数组Employee[] employees的长度。
【问题讨论】:
-
这是我见过的最复杂的维护和删除简单对象列表的代码。为什么不将员工存储在
List<Employee>中并避免重建数组的所有麻烦?我也不明白为这个操作使用流的复杂性。在通过流构建单独的列表后,您最终会遍历整个数组。我不明白那能给你带来什么。 -
为什么将员工保留为数组而不是
List?它是更适合您的用例的数据结构,并且您已经在removeEmployee方法中使用了一个列表。 -
是否绝对需要返回已删除的
Employee对象?还是仅仅知道某个员工是否被删除就足够了? -
如果这是家庭作业,我认为您也不应该使用流。你的作业可能要求你学习如何调整数组的大小、移动它的元素、计算当前元素等等。至少你应该尝试以这种方式实现它。
-
通常,如果作业告诉您使用
arrays,则表示只是arrays - 这个想法是你必须学会自己做这些细节。因此,您仍然不应该混入所有更高级的功能,如流。
标签: java arrays nullpointerexception java-stream