我一直在寻找开关在类型为Java,我在这里找到一个解决方案突破:Switch over type in java的Java 8开关的情况下默认与类类型
但是这个问题,解决方案是不是一个真正的switch
有break
就像,相信这会发生,因为我遍历Consumer
S,我想知道的好办法修改我当前的代码或清洁替代拥有的东西来处理我的课型,并断处理的第一场比赛和违约后是处理无与伦比的(这里是父类StripeObject
)。
我的业务是从webhooks处理条纹的事件,我使用stripe-java,所以我现在的代码是这样的:
public void handleWebHookEvent(Event eventJson) throws CardException, APIException, AuthenticationException, InvalidRequestException, APIConnectionException {
Stripe.apiKey = configuration.getString(AppConstants.STRIPE_API_KEY);
// Verify the event by fetching it from Stripe
Event event = Event.retrieve(eventJson.getId());
Logger.debug(AppUtils.concatStrings("|-> Event Received: [", event.getId(), "] Type: [", event.getType(), "] Request ID: [", event.getRequest(), "]"));
handleEventObject(event.getData().getObject());
}
private void handleEventObject(StripeObject stripeObject) {
switchType(stripeObject,
caze(Customer.class, this::handleEventObject),
caze(Card.class, this::handleEventObject),
caze(Charge.class, this::handleEventObject),
caze(Transfer.class, this::handleEventObject)
caze(StripeObject.class, object -> Logger.debug(AppUtils.concatStrings("|--> !!! Not Handled StripeObject !!! [", object.toString(), "]")))
);
}
private void handleEventObject(Customer customer) {
Logger.debug(AppUtils.concatStrings("|--> Customer ID <Description> : [", customer.getId(), " <", customer.getDescription(), ">]"));
}
private void handleEventObject(Card card) {
Logger.debug(AppUtils.concatStrings("|--> Card ID <Brand> : [", card.getId(), " <", card.getBrand(), ">]"));
}
private void handleEventObject(Charge charge) {
Logger.debug(AppUtils.concatStrings("|--> Charge ID <Description , Customer , Amount> : [", charge.getId(), " <", charge.getDescription(), " , ", charge.getCustomer() ," , ", charge.getAmount(), ">]"));
}
private void handleEventObject(Transfer transfer) {
Logger.debug(AppUtils.concatStrings("|--> Transfer ID <Description , Destination , Amount> : [", transfer.getId(), " <", transfer.getDescription(), " , ", transfer.getDestination() ," , ", transfer.getAmount(), ">]"));
}
@SuppressWarnings("unchecked")
private static <T> void switchType(StripeObject stripeObject, Consumer... consumers) {
for (Consumer consumer : consumers)
consumer.accept(stripeObject);
}
private static <T> Consumer caze(Class<T> clazz, Consumer<T> consumer) {
return obj -> Optional.of(obj).filter(clazz::isInstance).map(clazz::cast).ifPresent(consumer);
}
在当前的代码,如果evnet为客户为例,将打印:
|--> Customer ID <Description> ... etc
然后
|--> !!! Not Handled StripeObject !!! ... etc
它必须只打印第一行,而不打印第二行。
是的工作,非常感谢你 –