对于Java中特定实例的每个对象循环

时间:2018-02-22 20:34:02

标签: java loops for-loop

我希望每个循环都有一个循环来遍历一个对象数组..但只有作为特定类实例的对象。为了更清楚我的意思,我已经将下面的例子包括在内......

//Declare a list of employee objects
List<Employee> employees = new ArrayList<Employees>;

//Create some employees...
Employee employee = new Employee();
//The class EmployeeExtender extends and is a child of Employee 
EmployeeExtender employeeExtended = new EmployeeExtender(); 

//Now add all the employees, even the ones of different instances to the list
employees.add(employee);
employees.add(employeeExtended);

现在我想介绍一个循环遍历employees列表的每个循环,该循环只循环通过EmployeeExtender实例的员工。我可以遍历每一个并使用if语句(如下所示),但我想知道是否有一种方法没有单独的列表来执行此操作。

//I would like to only loop through employees that are an instance of EmployeeExtender
for(Employee employee : employees){
    //I would like to not have this if statement...
    if(employee instanceof EmployeeExtender){
        //do logic...
    }
}

我唯一的选择是创建单独的列表,还是使用if语句?我想知道是否还有更多选择。感谢。

2 个答案:

答案 0 :(得分:3)

没有考虑过的一个选择是将逻辑分配给一个空方法,这个方法在您感兴趣的子类中被覆盖。我不认为我&#39 ; d建议这样做,但你确实要求除了直接的每个/实例方式之外的其他选项。

public class Employee {
    public void doTheLogic(TheClassYoureCallingFrom caller) {
    }
}

public class EmployeeExtended extends Employee {
    @Override
    public void doTheLogic(TheClassYoureCallingFrom caller) {
        // The actual logic goes here.
    }
}

public class TheClassYoureCallingFrom {

    List<Employee> employees = new ArrayList<Employees>;

    public void theMethodYoureCallingFrom() {
        for (Employee employee : employees) {
            employee.doTheLogic(this);
        }
    }
}

当然,如果您不使用调用类的任何方法,则无需将其作为参数传递。

答案 1 :(得分:1)

您可以使用Streams:

employees.stream()
    .filter(employee -> employee instanceof EmployeeExtender)
    .forEach(employee -> {
        //do logic
    });