当前位置: 首页 > 知识库问答 >
问题:

将类类型传递给筛选函数

楚浩然
2023-03-14

我正在尝试按房间类别(手术室或技术室)返回过滤后的房间列表。有没有办法将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;
    }
}

共有3个答案

汪德明
2023-03-14

使方法接受Predicate参数,即:

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;
}

因此,现在每当您调用方法filterRoomByType时,您都可以传入一个函数,该函数定义了if条件的条件。

filterRoomByType(e -> e instanceof SurgeryRoom);

或者

filterRoomByType(e -> e instanceof TechRoom);
叶卓君
2023-03-14

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

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());
}
元景天
2023-03-14

将类作为参数传入,并使用此处记录的isInstance方法:https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#isInstance(java.lang.Object)

private <T extends IRoom> List<T> filterRoomByType(Class<T> roomType) {
    List<T> r = new ArrayList<>();
    for (IRoom room : rooms) {
        if (roomType.isInstance(room)) {
            r.add((T) room);
        }
    }
    return r;
}
 类似资料:
  • 让我们假设下面的方法(从番石榴的Iterables说): 这个系列: 然后编译以下代码并正确导出泛型 (在Guava中,这将返回< code>objs中所有字符串的iterable。) 但是现在让我们假设以下类: 我不知道如何调用并获取

  • 我无法将派生类传递给接受基类作为参数的函数。基类由“障碍物”组成,这些障碍物将被放置在“板”上。无效的board::setvalue(int-length、int-width、board 但是,这会导致编译器给出“未知参数转换…”错误。在浏览站点时,我发现我应该将派生对象作为常量进行传递,但这会导致问题,因为无法将常量分配给线路板(因为它包含指向非常量障碍物的指针)。 反过来,将线路板更改为包含常

  • 问题内容: 这是我的基本功能: 此功能能够连接并在我的数据库上执行查询… 我想创建相同的功能,但更通用。…前一个仅用于一个表(),新表必须能够接受查询的参数作为输入,以及将在其中执行查询的类类型。这将允许我仅使用一行来执行查询。 应该是这样的: 您发现我不知道如何“通用”代码… 我希望已经清楚了… PS 应该是DB()中表的类的代表。 谢谢。 问题答案: 如果您打算返回结果集,请使用:

  • 所以我试着做下面这样的事情 并且定义为 当尝试编译代码时,clang给出错误。我发现这是因为你不能从lambda推断出类型。 所以这实际上是正确的,因为我实际上希望的参数类型是从的参数推导出的类型。 所以我的问题是,有没有可能排除参数的推导,而只是使用的推导类型?

  • 问题内容: 我在MVC框架的View类上有3套。我想在controll类中引用它们。有人可以告诉我这实现了吗?下面是事件控制器。EventView类由addEvent,editEvent,deleteEvent组成,如何在Controller类中为其侦听器。有人可以在Controller类的顶部演示使用示例代码吗? 第二个问题,我只能从类本身更新a ,因此 在View类中具有代码是一种不好的做法,

  • 我正在尝试用Dapper和存储过程编写一些更通用的代码。我做了一些研究,但我被这部分卡住了… 我有一些类似实体的类,这些实体将被一些存储过程返回(那些过程不能被修改)。例如,我有两个类。 存储过程通常返回一些select子句,对于本例,它返回两个select子句,每个子句用于用户和角色的信息,因此我有以下类来存储这些子句。 在这个项目中,我们必须使用Dapper,所以我做了一个泛型函数,其中T是将