Java 将类类型传入筛选器函数

Java 将类类型传入筛选器函数,java,Java,我正在尝试按房间类别(手术室或技术室)返回过滤后的房间列表。有没有办法将room类作为参数传递给getAvailableRooms()而不是两个私有方法 import java.util.*; public class RoomBooker { private List<IRoom> rooms = new ArrayList<>(); public RoomBooker() { // Demo data rooms.

我正在尝试按房间类别(手术室或技术室)返回过滤后的
房间列表。有没有办法将room类作为参数传递给
getAvailableRooms()
而不是两个私有方法

import java.util.*;

public class RoomBooker {

    private List<IRoom> rooms = new ArrayList<>();

    public RoomBooker() {
        // Demo data
        rooms.add(new SurgeryRoom("Surgery 1"));
        rooms.add(new SurgeryRoom("Surgery 2"));
        rooms.add(new TechRoom("TechRoom 1"));
        rooms.add(new TechRoom("TechRoom 2"));
    }

    private List<IRoom> filterBySurgeryRoom() {
        List<IRoom> r = new ArrayList<>();
        for (IRoom room : rooms) {
            if (room instanceof SurgeryRoom) {
                r.add(room);
            }
        }
        return r;
    }

    private List<IRoom> filterByTechRoom() {
        List<IRoom> r = new ArrayList<>();
        for (IRoom room : rooms) {
            if (room instanceof TechRoom) {
                r.add(room);
            }
        }
        return r;
    }

    public List<IRoom> getAvailableRooms(String roomType, Date date) {  
        List<IRoom> available = new ArrayList<>();

        switch (roomType.toUpperCase()) {
            case "SURGERY":
                available = filterBySurgeryRoom();
                break;
            case "TECH":
                available = filterByTechRoom();
                break;
        }

        return available;
    }
}
import java.util.*;
公共教室预订员{
private List rooms=新建ArrayList();
公共客房预订员(){
//演示数据
增加(新手术室(“手术室1”);
新增(新手术室(“手术室2”));
添加(新技术室(“技术室1”);
房间。添加(新技术室(“技术室2”);
}
私有列表筛选器BySgergerRoom(){
列表r=新的ArrayList();
用于(IRoom房间:房间){
if(手术室实例){
r、 增加(房间);
}
}
返回r;
}
私有列表筛选器ByteChRoom(){
列表r=新的ArrayList();
用于(IRoom房间:房间){
if(技术室的房间实例){
r、 增加(房间);
}
}
返回r;
}
公共列表getAvailableRooms(字符串roomType,日期){
列表可用=新建ArrayList();
开关(roomType.toUpperCase()){
“外科”病例:
可用=filterBySurgeryRoom();
打破
案例“技术”:
available=filterByTechRoom();
打破
}
返回可用;
}
}

将该类作为参数传入,并使用此处记录的
isInstance
方法:

私有列表过滤器RoomByType(类roomType){
列表r=新的ArrayList();
用于(IRoom房间:房间){
if(房间类型isInstance(房间)){
r、 增加((T)房间);
}
}
返回r;
}
使方法接受一个参数,即:

private List<IRoom> filterRoomByType(Predicate<IRoom> predicate) {
        List<IRoom> r = new ArrayList<>();
        for (IRoom room : rooms) {
            if (predicate.test(room)) {
                r.add(room);
            }
        }
        return r;
}


您可以使用Java
Streams
轻松实现这一点

public List<IRoom> getAvailableRooms(Class<? extends IRoom> roomType, Date date) {
    return rooms.stream().filter(roomType::isInstance).collect(Collectors.toList());
}

将签名更改为
List filterRoomByType(ClassIt仍然被破坏,因为您正在返回一个
列表
。我更改了我的答案。如果您不需要使用泛型响应类型提供的其他类型信息,您可以根据shmosel的建议使用它的
.class
属性引用一个类。
列出手术室=roomBooker.getAvailableRooms(手术室.class);
roomType.cast(房间)
更安全。您是否有机会使用番石榴?不只是简单的Java 9.0阅读:如果您想提高您的code@alfasin不确定您是否需要枚举,只需执行即可differently@azro
enum
优于字符串常量。确实,您可以检查
instanceof
实例,但如果您想添加一个新房间,这不是很好吗“键入”只是更新枚举而不是创建新类?该方法没有错误,但现在当我执行
List surgeryRooms=roomBooker.getAvailableRooms(surgeryRooms,date);
时,它不会使用
Expression expected
error.@Christian查看底部的示例调用。
filterRoomByType(e -> e instanceof SurgeryRoom);
filterRoomByType(e -> e instanceof TechRoom);
public List<IRoom> getAvailableRooms(Class<? extends IRoom> roomType, Date date) {
    return rooms.stream().filter(roomType::isInstance).collect(Collectors.toList());
}
List<IRoom> list = getAvailableRooms(SurgeryRoom.class, new Date(1234));
List<IRoom> list = getAvailableRooms(TechRoom.class, new Date(1234));
public List<IRoom> getAvailableRooms(Class<? extends IRoom> roomType, Date date) {
    return rooms.stream()
            .filter(roomType::isInstance)         //== .filter(r->roomType.isInstance(r))
            .filter(r -> r.getDate().after(date))
            .collect(Collectors.toList());
}