Last active
August 14, 2017 12:17
-
-
Save mhewedy/59ae4d55a97b9f41f70f744e621eadcd to your computer and use it in GitHub Desktop.
Using java 8 streams to build a rules validator/transformer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import java.util.Optional; | |
| import java.util.function.Function; | |
| import java.util.function.Predicate; | |
| import java.util.stream.Stream; | |
| public class Test { | |
| public static void main(String[] args) { | |
| Request request = new Request(600, "Abbas"); | |
| Optional<Response> response = Stream.of(request) | |
| .filter(new BasicRequestValidator()) // TODO create a singletone of each rule to use it. for example if using spring then use the @Bean/@Component to singletone bean | |
| .map(new YaqeenRule(new YaqeenWSCaller())) | |
| .map(new NationalityBasedRule()) | |
| .filter(Response::isSuccess) | |
| .findFirst(); | |
| System.out.println(response.orElseThrow(() -> new IllegalArgumentException("bla bla bla"))); | |
| } | |
| /// Rules, validators, etc | |
| private static class BasicRequestValidator implements Predicate<Request> { | |
| @Override | |
| public boolean test(Request request) { | |
| System.out.println("Applying BasicRequestValidator to: " + request); | |
| return request.nin >= 100; | |
| } | |
| } | |
| private static class YaqeenRule implements Function<Request, YaqeenResponse> { | |
| YaqeenWSCaller wsCaller; | |
| YaqeenRule(YaqeenWSCaller wsCaller) { | |
| this.wsCaller = wsCaller; | |
| } | |
| @Override | |
| public YaqeenResponse apply(Request request) { | |
| System.out.println("Applying YaqeenRule to: " + request); | |
| // TODO call WS using wsCaller | |
| try { | |
| if (request.nin >= 500) { | |
| return new YaqeenResponse(request, "Egypt"); | |
| } else if (request.nin >= 100) { | |
| return new YaqeenResponse(request, "Yemen"); | |
| } | |
| } catch (Exception ex) { | |
| System.err.println(ex.getMessage()); | |
| } | |
| return new YaqeenResponse(); | |
| } | |
| } | |
| private static class NationalityBasedRule implements Function<YaqeenResponse, Response> { | |
| @Override | |
| public Response apply(YaqeenResponse yaqeenResponse) { | |
| System.out.println("Applying NationalityBasedRule to: " + yaqeenResponse); | |
| if (yaqeenResponse.nationality.equals("Egypt")) { | |
| return new Response(true); | |
| } | |
| return new Response(false); | |
| } | |
| } | |
| /// objects --------- | |
| static class Request { | |
| int nin; | |
| String name; | |
| Request(int nin, String name) { | |
| this.nin = nin; | |
| this.name = name; | |
| } | |
| @Override | |
| public String toString() { | |
| return "Request{" + | |
| "nin=" + nin + | |
| ", name='" + name + '\'' + | |
| '}'; | |
| } | |
| } | |
| static class Response { | |
| boolean success; | |
| Response(boolean success) { | |
| this.success = success; | |
| } | |
| boolean isSuccess() { | |
| return success; | |
| } | |
| @Override | |
| public String toString() { | |
| return "Response{" + | |
| "success=" + success + | |
| '}'; | |
| } | |
| } | |
| static class YaqeenResponse { | |
| Request request; | |
| String nationality; | |
| boolean success; | |
| YaqeenResponse() { | |
| } | |
| YaqeenResponse(Request request, String nationality) { | |
| this.request = request; | |
| this.nationality = nationality; | |
| this.success = true; | |
| } | |
| @Override | |
| public String toString() { | |
| return "YaqeenResponse{" + | |
| "request=" + request + | |
| ", nationality='" + nationality + '\'' + | |
| '}'; | |
| } | |
| } | |
| // util | |
| static class YaqeenWSCaller{ | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment