我一般喜歡使用Java 8個Lambda表達式在特定的情景:
public void configure() throws Exception {
from(incomingRoute)
.choice()
.when(bodyTypeIs(TYPE.A))
.to(A_Endpoint)
.when(bodyTypeIs( TYPE.B))
.to(B_Endpoint)
.when(bodyTypeIs( TYPE.C))
.to(C_Endpoint)
.otherwise()
.to(errorEndpoint);
}
private Predicate bodyTypeIs(TYPE type) {
return e -> e.getIn().getBody(BodyType.class).getType() == type;
}
此外,使用駱駝Predicate
s的Java的8允許一些真棒流利的API大樓,如添加您自己的功能類型Predicate
:
@FunctionalInterface
public interface ComposablePredicate extends Predicate, java.util.function.Predicate<Exchange> {
@Override
default boolean matches(Exchange exchange) {
return test(exchange);
}
@Override
default ComposablePredicate and(java.util.function.Predicate<? super Exchange> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
@Override
default ComposablePredicate negate() {
return (t) -> !test(t);
}
@Override
default ComposablePredicate or(java.util.function.Predicate<? super Exchange> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
}
,它允許你寫這樣的東西:
public void configure() throws Exception {
from(incomingRoute)
.choice()
.when(bodyTypeIs(TYPE.A) .or (bodyTypeIs(TYPE.A1)))
.to(A_Endpoint)
.when(bodyTypeIs( TYPE.B).negate())
.to(NOT_B_Endpoint)
.when(bodyTypeIs( TYPE.C) .and (bodyNameIs("name")))
.to(C_Endpoint)
.otherwise()
.to(errorEndpoint);
}
private ComposablePredicate bodyTypeIs(TYPE type) {
return e -> bodyFrom(e).getType() == type;
}
private BodyType bodyFrom(Exchange e) {
return e.getIn().getBody(BodyType.class);
}
private ComposablePredicate bodyNameIs(String name) {
return e -> bodyFrom(e).getName().equals(name);
}
你可以使用謂詞,但它是不一樣的假定的equals()測試的意義了Java開關。所以,它是以自己的方式重複的。不過,在某些情況下,你可能更喜歡它的可讀性:http://camel.apache.org/predicate.html –
我完全同意Darius,Camel'Predicate'通常是我認爲的方式,你的代碼是這種方式更具可讀性。 –