2017-11-12 5 views
0

クラス(SurgeryRoomまたはTechRoom)でroomsのフィルタリストを返そうとしています。 2つのプライベートメソッドを持つ代わりに、部屋クラスを引数としてgetAvailableRooms()に渡すことでそれを行う方法はありますか?たび今ではクラスの種類をフィルタ関数に渡す

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

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

万が一、グアバを使用していますか? – shmosel

+0

単純なJava 9.0だけではありません – Christian

+1

あなたのコードを改善したい場合は、https://stackoverflow.com/questions/11575376/why-use-enums-instead-of-constantsを読んでください。 – alfasin

答えて

3

パスとは、ここで説明isInstanceメソッドを使用しますメソッドfilterRoomByTypeを呼び出すと、if条件の条件を定義する関数を渡すことができます。

filterRoomByType(e -> e instanceof SurgeryRoom); 

または

filterRoomByType(e -> e instanceof TechRoom); 
+3

'予期しないバウンド'エラーが発生しました – Christian

+3

署名を変更する filterRoomByType(Class <?extends IRoom> ' – shmosel

+2

' List 'を返すので、まだ壊れています。 – shmosel

2

方法はPredicateパラメータすなわちを受け入れます引数としてクラスの

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

このメソッドはエラーですが、今は' List surgeryRooms = roomBooker.getAvailableRooms(SurgeryRoom、date); ''予想される式でエラーが発生しました。 – Christian

+2

@Christian一番下のサンプルコールを見てください。 – shmosel

2

あなたはこの簡単

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

を達成するためにJava Streamsを使用して呼び出すことができます。

List<IRoom> list = getAvailableRooms(SurgeryRoom.class, new Date(1234)); 
List<IRoom> list = getAvailableRooms(TechRoom.class, new Date(1234)); 

その後、あなたはあなただけのすべての特定のクラスのための部屋やパラメータに日付の後である日それらを得るようなもの filter part

を向上させるのと同じ方法を使用することができるだろうdateフィルタを追加しますとき

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()); 
} 
関連する問題