Skip to content

Commit 91ec114

Browse files
authored
Merge pull request eugenp#5603 from sandy03934/master
BAEL-2303 Added code to demonstrate how to replace multiple if statements in Java
2 parents d00efaa + 3c558d6 commit 91ec114

18 files changed

+355
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.baeldung.reducingIfElse;
2+
3+
public class AddCommand implements Command {
4+
5+
private int a;
6+
private int b;
7+
8+
public AddCommand(int a, int b) {
9+
this.a = a;
10+
this.b = b;
11+
}
12+
13+
@Override
14+
public Integer execute() {
15+
return a + b;
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.baeldung.reducingIfElse;
2+
3+
public class AddRule implements Rule {
4+
5+
private int result;
6+
7+
@Override
8+
public boolean evaluate(Expression expression) {
9+
boolean evalResult = false;
10+
if (expression.getOperator() == Operator.ADD) {
11+
this.result = expression.getX() + expression.getY();
12+
evalResult = true;
13+
}
14+
return evalResult;
15+
}
16+
17+
@Override
18+
public Result getResult() {
19+
return new Result(result);
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.baeldung.reducingIfElse;
2+
3+
public class Addition implements Operation {
4+
@Override
5+
public int apply(int a, int b) {
6+
return a + b;
7+
}
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.baeldung.reducingIfElse;
2+
3+
public class Calculator {
4+
5+
public int calculate(int a, int b, String operator) {
6+
int result = Integer.MIN_VALUE;
7+
8+
if ("add".equals(operator)) {
9+
result = a + b;
10+
} else if ("multiply".equals(operator)) {
11+
result = a * b;
12+
} else if ("divide".equals(operator)) {
13+
result = a / b;
14+
} else if ("subtract".equals(operator)) {
15+
result = a - b;
16+
} else if ("modulo".equals(operator)) {
17+
result = a % b;
18+
}
19+
return result;
20+
}
21+
22+
public int calculateUsingSwitch(int a, int b, String operator) {
23+
int result = 0;
24+
switch (operator) {
25+
case "add":
26+
result = a + b;
27+
break;
28+
case "multiply":
29+
result = a * b;
30+
break;
31+
case "divide":
32+
result = a / b;
33+
break;
34+
case "subtract":
35+
result = a - b;
36+
break;
37+
case "modulo":
38+
result = a % b;
39+
break;
40+
default:
41+
result = Integer.MIN_VALUE;
42+
}
43+
return result;
44+
}
45+
46+
public int calculateUsingSwitch(int a, int b, Operator operator) {
47+
int result = 0;
48+
switch (operator) {
49+
case ADD:
50+
result = a + b;
51+
break;
52+
case MULTIPLY:
53+
result = a * b;
54+
break;
55+
case DIVIDE:
56+
result = a / b;
57+
break;
58+
case SUBTRACT:
59+
result = a - b;
60+
break;
61+
case MODULO:
62+
result = a % b;
63+
break;
64+
default:
65+
result = Integer.MIN_VALUE;
66+
}
67+
return result;
68+
}
69+
70+
public int calculate(int a, int b, Operator operator) {
71+
return operator.apply(a, b);
72+
}
73+
74+
public int calculateUsingFactory(int a, int b, String operation) {
75+
Operation targetOperation = OperatorFactory.getOperation(operation)
76+
.orElseThrow(() -> new IllegalArgumentException("Invalid Operator"));
77+
return targetOperation.apply(a, b);
78+
}
79+
80+
public int calculate(Command command) {
81+
return command.execute();
82+
}
83+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.baeldung.reducingIfElse;
2+
3+
public interface Command {
4+
Integer execute();
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.baeldung.reducingIfElse;
2+
3+
public class Division implements Operation {
4+
@Override public int apply(int a, int b) {
5+
return a / b;
6+
}
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.baeldung.reducingIfElse;
2+
3+
public class Expression {
4+
5+
private Integer x;
6+
private Integer y;
7+
private Operator operator;
8+
9+
public Expression(Integer x, Integer y, Operator operator) {
10+
this.x = x;
11+
this.y = y;
12+
this.operator = operator;
13+
}
14+
15+
public Integer getX() {
16+
return x;
17+
}
18+
19+
public Integer getY() {
20+
return y;
21+
}
22+
23+
public Operator getOperator() {
24+
return operator;
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.baeldung.reducingIfElse;
2+
3+
public class Modulo implements Operation {
4+
@Override public int apply(int a, int b) {
5+
return a % b;
6+
}
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.baeldung.reducingIfElse;
2+
3+
public class Multiplication implements Operation {
4+
@Override public int apply(int a, int b) {
5+
return 0;
6+
}
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.baeldung.reducingIfElse;
2+
3+
public interface Operation {
4+
int apply(int a, int b);
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.baeldung.reducingIfElse;
2+
3+
public enum Operator {
4+
5+
ADD {
6+
@Override
7+
public int apply(int a, int b) {
8+
return a + b;
9+
}
10+
},
11+
12+
MULTIPLY {
13+
@Override
14+
public int apply(int a, int b) {
15+
return a * b;
16+
}
17+
},
18+
19+
SUBTRACT {
20+
@Override
21+
public int apply(int a, int b) {
22+
return a - b;
23+
}
24+
},
25+
26+
DIVIDE {
27+
@Override
28+
public int apply(int a, int b) {
29+
return a / b;
30+
}
31+
},
32+
33+
MODULO {
34+
@Override
35+
public int apply(int a, int b) {
36+
return a % b;
37+
}
38+
};
39+
40+
public abstract int apply(int a, int b);
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.baeldung.reducingIfElse;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.Optional;
6+
7+
public class OperatorFactory {
8+
9+
static Map<String, Operation> operationMap = new HashMap<>();
10+
static {
11+
operationMap.put("add", new Addition());
12+
operationMap.put("divide", new Division());
13+
operationMap.put("multiply", new Multiplication());
14+
operationMap.put("subtract", new Subtraction());
15+
operationMap.put("modulo", new Modulo());
16+
}
17+
18+
public static Optional<Operation> getOperation(String operation) {
19+
return Optional.ofNullable(operationMap.get(operation));
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.baeldung.reducingIfElse;
2+
3+
public class Result {
4+
int value;
5+
6+
public Result(int value) {
7+
this.value = value;
8+
}
9+
10+
public int getValue() {
11+
return value;
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.baeldung.reducingIfElse;
2+
3+
public interface Rule {
4+
5+
boolean evaluate(Expression expression);
6+
7+
Result getResult();
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.baeldung.reducingIfElse;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Optional;
6+
import java.util.stream.Collectors;
7+
8+
public class RuleEngine {
9+
10+
private static List<Rule> rules = new ArrayList<>();
11+
12+
static {
13+
rules.add(new AddRule());
14+
}
15+
16+
public Result process(Expression expression) {
17+
18+
Rule rule = rules.stream()
19+
.filter(r -> r.evaluate(expression))
20+
.findFirst()
21+
.orElseThrow(() -> new IllegalArgumentException("Expression does not matches any Rule"));
22+
return rule.getResult();
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.baeldung.reducingIfElse;
2+
3+
public class Subtraction implements Operation {
4+
@Override public int apply(int a, int b) {
5+
return a - b;
6+
}
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.baeldung.reduceIfelse;
2+
3+
import com.baeldung.reducingIfElse.AddCommand;
4+
import com.baeldung.reducingIfElse.Calculator;
5+
import com.baeldung.reducingIfElse.Operator;
6+
import org.junit.Test;
7+
8+
import static org.junit.Assert.assertEquals;
9+
10+
public class CalculatorUnitTest {
11+
12+
@Test
13+
public void whenCalculateUsingStringOperator_thenReturnCorrectResult() {
14+
Calculator calculator = new Calculator();
15+
int result = calculator.calculate(3, 4, "add");
16+
assertEquals(7, result);
17+
}
18+
19+
@Test
20+
public void whenCalculateUsingEnumOperator_thenReturnCorrectResult() {
21+
Calculator calculator = new Calculator();
22+
int result = calculator.calculate(3, 4, Operator.valueOf("ADD"));
23+
assertEquals(7, result);
24+
}
25+
26+
@Test
27+
public void whenCalculateUsingCommand_thenReturnCorrectResult() {
28+
Calculator calculator = new Calculator();
29+
int result = calculator.calculate(new AddCommand(3, 7));
30+
assertEquals(10, result);
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.baeldung.reduceIfelse;
2+
3+
import com.baeldung.reducingIfElse.Expression;
4+
import com.baeldung.reducingIfElse.Operator;
5+
import com.baeldung.reducingIfElse.Result;
6+
import com.baeldung.reducingIfElse.RuleEngine;
7+
import org.junit.Test;
8+
9+
import static org.junit.Assert.assertEquals;
10+
import static org.junit.Assert.assertNotNull;
11+
12+
public class RuleEngineUnitTest {
13+
14+
@Test
15+
public void whenNumbersGivenToRuleEngine_thenReturnCorrectResult() {
16+
Expression expression = new Expression(5, 5, Operator.ADD);
17+
RuleEngine engine = new RuleEngine();
18+
Result result = engine.process(expression);
19+
20+
assertNotNull(result);
21+
assertEquals(10, result.getValue());
22+
}
23+
}

0 commit comments

Comments
 (0)