2016-08-11 11 views
3

私は訪問オブジェクトのリストを持っています。今度は、特定の日の利用可能時間を含む別のリストを作成したいと思います。2つのリストを含むストリームクエリ

public class Visit { 
    private int id; 
    private Date date; 
    private Time time; 
    private Pet pet; 
    private Vet vet; 

これは、配列がString []すべての訪問時間を含むです:

public class VisitTime { 

    private static final String[] visitTime = 
     {"09:00:00","09:30:00","10:00:00","10:30:00","11:00:00","11:30:00","12:00:00", 
       "12:30:00","13:00:00","13:30:00","14:00:00","14:30:00","15:00:00","15:30:00","16:00:00","16:30:00"}; 

ので、今Imは訪問のDbのリスト(各訪問は時間を定義している)から取得し、他があるかどうかをチェックします訪問を予定する自由な時間。

私は2つの方法を書いています.1つはストリームの2番目の反復で、どちらも期待どおりに動作します。

どのように私はターミナルメソッドを2回使用しないようにこのメソッドを再構築できますか。

public List<String> getHoursAvailable12(int vetId, String date){ 
     List<Visit> visitList = getVisitByVetIdAndDate(vetId, date); 
     List<String> hoursAvailable = new ArrayList<>(Arrays.asList(VisitTime.getVisittime())); 


     List<String> hoursTaken = visitList.stream().map(Visit::getTime).map(Time::toString).collect(Collectors.toList()); 

     return hoursAvailable.stream().filter(x -> !hoursTaken.contains(x)).collect(Collectors.toList()); 
    } 

と、ここのコレクションを持つ古い学校のメソッドです:

public List<String> getHoursAvailable(int vetId, String date){ 
     List<Visit> visitList = getVisitByVetIdAndDate(vetId,date); 
     ArrayList<String> hoursAvailable = new ArrayList<>(Arrays.asList(VisitTime.getVisittime())); 

     for(Visit x : visitList){ 
      { 
      String time = x.getTime().toString(); 
      if(hoursAvailable.contains(time)) hoursAvailable.remove(time); 
      } 
     } 
     return hoursAvailable; 
    } 

答えて

1

あなたはこれを試すことができます。あなたはここにいくつかの利点を得るは、リストと比較してより速いHashSetである

public Set<String> getHoursAvailable(int vetId, String date){ 
    List<Visit> visitList = getVisitByVetIdAndDate(vetId,date); 
    Set<String> hoursAvailable = new LinkedHashSet<>(
      Arrays.asList(VisitTime.getVisittime())); 

    visitList.stream() 
     .map(Visit::getTime) 
     .map(Time::toString) 
     .forEach(vt-> hoursAvailable.removeIf(s->s.equals(vt))); 

    return hoursAvailable; 
} 
+0

がうまく動作する – filemonczyk

関連する問題