I have the following ready-made java 8 method for production; which the
- list iterations
- predicate filters
- if it finds filter-based method 0, throw a
RuntimeException with message 1. - if it finds more than one filter-based method, throw a
RuntimeException with message 2. - else returns the found method
I achieved that I wanted to use some kind of lambda magic with 90s if else ...
private Method getEventHandler(Class listener, Class<? extends Event> event) { List<Method> methods = asList(listener.getMethods()) .stream() .filter(method -> shouldHandleEvent(method, event)) .collect(Collectors.toList()); if ( methods.size() == 0 ) { throw new RuntimeException("No event handlers"); } else if ( methods.size() > 1 ) { throw new RuntimeException("More than one handler."); } return methods.get(0); } private boolean shouldHandleEvent(Method method, Class<? extends Event> event) { return method.getParameterCount() ==1 && method.getParameterTypes()[0].isAssignableFrom(event); }
If I had only two conditions, where I would check the exact 1 or more / less than 1, I could write the code as shown below,
private Method getEventHandler(Class listener, Class<? extends Event> event) { return asList(listener.getMethods()) .stream() .filter(method -> shouldHandleEvent(method, event)) .findFirst() .orElseThrow(() -> new RuntimeException("No event handlers")); }
But I have three conditions for checking, and I try to act as if I lived in 2016, so I try to use lambda to replace if else in the first method, so that it becomes even cleaner.
My guess is something like below
private Method getEventHandlerProposed(Class listener, Class<? extends Event> event) { return asList(listener.getMethods()) .stream() .filter(method -> shouldHandleEvent(method, event)) .collect(Collectors.toList()) .stream() .count() == 0 -> throw new RuntimeException("No event handlers"); .or .count() > 1 -> throw new RuntimeException("More than one handler."); .orElse() .findFirst() .get(); }
I'm sure this is not possible, as I suggest, but I am looking for some neat lambda that could look better and make me happy.
source share