Java 8 lambdas using if else in list stream

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.

+5
source share

Source: https://habr.com/ru/post/1240738/


All Articles