Java 具有两个列表的流查询

Java 具有两个列表的流查询,java,java-stream,Java,Java Stream,我有一个访问对象列表,现在我想建立另一个列表,其中包含给定日期的可用时间 public class Visit { private int id; private Date date; private Time time; private Pet pet; private Vet vet; 这是包含所有访问时间的数组字符串[]: public class VisitTime { private static final String[] v

我有一个访问对象列表,现在我想建立另一个列表,其中包含给定日期的可用时间

public class Visit {
    private int id;
    private Date date;
    private Time time;
    private Pet pet;
    private Vet vet;  
这是包含所有访问时间的数组字符串[]:

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"};
所以现在我从Db的访问列表(每次访问都有定义的时间)中获取信息,并检查是否还有其他空闲时间来安排访问

为此,我编写了两种方法,一种是使用迭代,另一种是使用流,这两种方法都按预期工作

我要问的是,我如何重建这个方法,使之不再使用terminal方法两次

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 getHoursAvailable12(int-vetId,String-date){
List visitList=GetVISITBYVETIDANDATE(vetId,日期);
List hoursAvailable=newarraylist(Arrays.asList(VisitTime.getVisittime());
List hourstake=visitList.stream();
return hoursAvailable.stream().filter(x->!hourstake.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;
    }
public List gethoursavable(int-vetId,String-date){
List visitList=GetVISITBYVETIDANDATE(vetId,日期);
ArrayList hoursAvailable=新的ArrayList(Arrays.asList(VisitTime.getVisittime());
用于(访问x:访问列表){
{
字符串时间=x.getTime().toString();
如果(hoursAvailable.contains(time))hoursailable.remove(time);
}
}
返回时间可用;
}

您可以试试这个。您在这里得到了一些好处,
contains
HashSet
中比List更快

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;
}
public Set gethoursavable(int-vetId,String-date){
List visitList=GetVISITBYVETIDANDATE(vetId,日期);
Set hoursAvailable=新建LinkedHashSet(
asList(VisitTime.getVisittime());
visitList.stream()
.map(访问::getTime)
.map(时间::toString)
.forEach(vt->hoursavable.removeIf(s->s.equals(vt));
返回时间可用;
}