난 당신이 이이 일을해야하는지 모르겠지만, 당신이 이 그것을 할 수있는 것처럼 보인다 :
이
public static class Matcher<T> {
Predicate<T> predicate;
Class<T> clazz;
public Matcher(Predicate<T> t, Class<T> clazz) {
this.predicate = t;
this.clazz = clazz;
}
@SuppressWarnings("unchecked")
public boolean equals(Object o) {
if (o != null && this.clazz.isInstance(o)) {
System.out.println("Checking item " + o + " against predicate " + this.predicate);
return this.predicate.test((T) o);
}
return false;
}
}
public static void main(String args[]) {
ArrayBlockingQueue<Integer> oddsOnly = new ArrayBlockingQueue<>(10);
oddsOnly.addAll(Arrays.asList(1, 3, 5, 7, 9, 11, 13));
ArrayBlockingQueue<Integer> oddsAndEves = new ArrayBlockingQueue<>(10);
oddsAndEves.addAll(Arrays.asList(1, 2, 3, 4, 5));
Predicate<Integer> evenPredicate = (i) -> i % 2 == 0;
System.out.println(oddsOnly.contains(new Matcher<>(evenPredicate, Integer.class))); // prints false
System.out.println(oddsAndEves.contains(new Matcher<>(evenPredicate, Integer.class))); // prints true
}
는 출력 :
Checking item 1 against predicate QueueEquals$Matcher$$Lambda$1/[email protected]
Checking item 3 against predicate QueueEquals$Matcher$$Lambda$1/[email protected]
Checking item 5 against predicate QueueEquals$Matcher$$Lambda$1/[email protected]
Checking item 7 against predicate QueueEquals$Matcher$$Lambda$1/[email protected]
Checking item 9 against predicate QueueEquals$Matcher$$Lambda$1/[email protected]
Checking item 11 against predicate QueueEquals$Matcher$$Lambda$1/[email protected]
Checking item 13 against predicate QueueEquals$Matcher$$Lambda$1/[email protected]
false
Checking item 1 against predicate QueueEquals$Matcher$$Lambda$1/[email protected]
Checking item 2 against predicate QueueEquals$Matcher$$Lambda$1/[email protected]
true
그것은 내가 원하는 만드는가 그래도 샤워를하고 .... 플러스, pvg 올바르게 지적 - 이것은 작동하지 않을 수 있습니다. BlockingQueue 구현은 equals()
을 호출하기 전에 hashCode()
을 호출 할 수 있습니다.
saner 옵션은 차단 대기열을 반복하고 각 요소에 대해 술어를 실행하는 것입니다. BlockingQueue
인터페이스에는 iterator
이 없지만 ArrayBlockingQueue
및 LinkedBlockingQueue
do와 같은 많은 차단 대기열 구현이 있습니다.
쉿 행동. – pvg
@pvg 검색은 메시지에서 특정 ID를 찾는 것을 기반으로합니다. 고정 된 술어를 기반으로하는 "여러"대기열이있는 경우는 아닙니다. 이 방법을 사용할 때 모든 메시지에 대한 대기열이 필요합니다. – javadba
메시지 ID가 고유하다면 .equals를 재정의해야합니다. 또는 우선 순위를 설정하십시오. 특정 메시지를 식별해야하는 경우 주문을 부과하는 대기열을 사용할 때 어떤 점이 있습니까? '대기열을 대기열처럼 행동하게 만드는 방법'대신 해결하려는 문제를 설명해야합니다. – pvg