Skip to content

Instantly share code, notes, and snippets.

@mhewedy
Last active August 14, 2017 12:17
Show Gist options
  • Select an option

  • Save mhewedy/59ae4d55a97b9f41f70f744e621eadcd to your computer and use it in GitHub Desktop.

Select an option

Save mhewedy/59ae4d55a97b9f41f70f744e621eadcd to your computer and use it in GitHub Desktop.
Using java 8 streams to build a rules validator/transformer
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