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;
}
或
您可以使用JavaStreams
轻松实现这一点
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@azroenum
优于字符串常量。确实,您可以检查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());
}