我正在尝试按房间类别(手术室或技术室)返回过滤后的房间列表。有没有办法将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;
}
}
使方法接受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);
您可以使用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());
}
将类作为参数传入,并使用此处记录的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是将