2017-07-28 5 views
1

私のリストには次のフィルタがあります。私は指定された期間に住んでいる人が必要です。両方のリストのvalidToはオプションです。ご覧のとおり、少し複雑ですし、他のフィルタもあるので、述語を変数に移動することで簡単にする必要があります。別の述語を作成

people.stream() 
      .filter(person -> peopleTime.stream().anyMatch(time -> 
        (!person.getValidTo().isPresent() || time.getValidFrom().isBefore(person.getValidTo().get()) || time.getValidFrom().isEqual(person.getValidTo().get())) 
          && (!time.getValidTo().isPresent() || time.getValidTo().get().isAfter(person.getValidFrom()) || time.getValidTo().get().isEqual(person.getValidFrom())))) 

私はいくつかのBiPredicateを作成し、それを使用しようとしたが、anyMatchは、単一の述語を期待しています。 PersonクラスはTimeクラスを継承します。

お願いします。

+1

あなたの質問は理解しづらいです、何をしようとしていますか?あなたの 'Predicate

+0

PersonとTimeという2つのパラメータがあります。これは単一述語ではなく、むしろBiPredicateです。 – JiKra

+0

はい、これら2つのパラメータのスコープは同じではありません。人をカプセル化する 'Predicate

答えて

1

私は理解していたものから、あなたは基本的に持っている:

public abstract static class MyDate { 
    public abstract boolean isBefore(MyDate other); 
    public abstract boolean isAfter(MyDate other); 
    public abstract boolean isEqual(MyDate other); 
} 
public static abstract class Time { 
    public abstract Optional<MyDate> getValidTo(); 
    public abstract Optional<MyDate> getValidFrom(); 
} 

public static abstract class Person extends Time { 
} 

(まあ、私は今の実装を残しています)。

あなたは以下のクラスを作成した場合:

public static class TimePersonPredicate implements Predicate<Time> { 

    private final Person person; 
    public TimePersonPredicate(Person person) { 
     this.person = person; 
    } 
    @Override 
    public boolean test(Time time) { 
     return (!person.getValidTo().isPresent() || time.getValidFrom().get().isBefore(person.getValidTo().get()) || time.getValidFrom().get().isEqual(person.getValidTo().get())) 
       && (!time.getValidTo().isPresent() || time.getValidTo().get().isAfter(person.getValidFrom().get()) || time.getValidTo().get().isEqual(person.getValidFrom().get())); 
    } 

} 

をあなたはこのようなあなたのフィルターラインを短くすることができます

public static void main(String[] args) { 
    List<Person> people = new ArrayList<>(); 
    List<Time> peopleTime = new ArrayList<>(); 
    people.stream() 
     .filter(person -> peopleTime.stream().anyMatch(new TimePersonPredicate(person)))... 
} 

は、あなたが何を望むかということですか?

+2

ありがとうございます。最後に、同様の静的メソッドを使用しました。 .filter(person - > peopleTIme.stream()。anyMatch(時間 - >交差(人、時間))) – JiKra