publicclassCalculator{ publicintadd(int a, int b){ return a + b; } }
뺄셈 모듈도 만들어 주세요
1 2 3 4 5 6 7 8
publicclassCalculator{ publicintadd(int a, int b){ return a + b; } publicintsubtract(int a, int b){ return a - b; } }
숫자 여러개 받을 수 있게 해주세요
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
publicclassCalculator{ publicintadd(int[] arrs){ int result = 0; for(int a : arrs) { result += a; } return result; } publicintsubtract(int[] arrs){ int result = 0; for(int a : arrs) { result -= a; } return result; } }
0 보다 작은 수가 입력된 경우엔 무시해 주세요
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
publicclassCalculator{ publicintadd(int[] arrs){ int result = 0; for(int a : arrs) { if(a <= 0) continue; result += a; // (1) } return result; } publicintsubtract(int[] arrs){ int result = 0; for(int a : arrs) { if(a <= 0) continue; result -= a; // (2) } return result; } }
publicclassCalculator{ interfaceOperator{ intoperate(int a, int b); } privatebooleanisGreaterThanZero(int a){ return a <= 0; } private List<Integer> getOnlyNaturalnumbers(int[] arrs){ List<Integer> list = new ArrayList<>(); for(int a : arrs) { if(isGreaterThanZero(a)) list.add(a); } return list; } privateintcalcuate(List<Integer> arrs, Operator opt){ int result = 0; for(int a : arrs) { result = opt.operate(result, a); } return result; } publicintadd(int[] arrs){ return calcuate(getOnlyNaturalnumbers(arrs), new Operator() { publicintoperate(int a, int b){ return a + b; } }); } publicintsubtract(int[] arrs){ return calcuate(getOnlyNaturalnumbers(arrs), new Operator() { publicintoperate(int a, int b){ return a - b; } }); } }
곱셈, 나눗셈이 추가되더라도..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
... publicintmultiply(int[] arrs){ return calcuate(getOnlyNaturalnumbers(arrs), new Operator() { publicintoperate(int a, int b){ return a * b; } }); } publicintdivide(int[] arrs){ return calcuate(getOnlyNaturalnumbers(arrs), new Operator() { publicintoperate(int a, int b){ return a / b; } }); } ...
publicclassCalculator{ interfaceFunction{ intapply(int a, int b); } privatebooleanisGreaterThanZero(int a){ return a <= 0; } private List<Integer> filter(int[] arrs){ List<Integer> list = new ArrayList<>(); for(int a : arrs) { if(isGreaterThanZero(a)) list.add(a); } return list; } privateintcalcuate(List<Integer> arrs, Function opt){ int result = 0; for(int a : arrs) { result = opt.apply(result, a); } return result; } publicintadd(int[] arrs){ return calcuate(filter(arrs), new Function() { publicintapply(int a, int b){ return a + b; } }); } publicintsubtract(int[] arrs){ return calcuate(filter(arrs), new Function() { publicintapply(int a, int b){ return a - b; } }); } }
Java8 Stream API와 Lambda 로 바꿔 볼까요
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
publicclassCalculator{ private Predicate<Integer> ltzero = a -> a <= 0; publicintadd(List<Integer> arrs){ return arrs.stream().filter(ltzero).reduce((a, b) -> a + b).get(); } publicintsubtract(List<Integer> arrs){ return arrs.stream().filter(ltzero).reduce((a, b) -> a - b).get(); } publicintmultiply(List<Integer> arrs){ return arrs.stream().filter(ltzero).reduce((a, b) -> a * b).get(); } publicintdivide(List<Integer> arrs){ return arrs.stream().filter(ltzero).reduce((a, b) -> a / b).get(); } }