2019년 8월 8일 목요일

Java Lambda Expressions (람다 표현식)




* Lambda Expressions (람다 표현식)
 

 익명 클래스(Anonymous class)는 만약 구현해야 할 인터페이스안의 메소드가 단 하나밖에 없는 경우처럼 간단한 경우에 실제 코드상에 해당 메소드를 구현하는 방법은 코드의 가독성이 떨어지고 다루기 불편해 보인다.

 이런 경우에서 자바 8부터 지원되는 람다 표현식은 익명 클래스의 목적은 그대로 사용하면서 간소화한 문법으로 변경된 것이다.

참고 람다표현식 API문서 :https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

아래의 hackerrank 문제는 isOdd, isPrime, isPalindrome 메소드들은 
PerformOperation 객체를 리턴하는데 람다표현식을 이용하여 작성하였다. 

PerformOperation 인터페이스는 구현해야 할 메소드가 한 개밖에 없어 심플하다.
이런 케이스에 람다표현식을 사용하게 되면 가독성이 좋아질 것이다.



interface PerformOperation { 
    boolean check(int a);
}
class MyMath {
    public static boolean checker(PerformOperation p, int num) {
       return p.check(num);
    }

    public static PerformOperation isOdd(){ //짝수, 홀수 찾기
       //람다 표현식을 이용하여 인터페이스의 check 메소드를 구현하고 인스턴스까지 생성할 수 있다. 
       return (int num) -> num % 2 != 0; 
    }

    public static PerformOperation isPrime(){ //소수 찾기
         return (int num) -> {
             for(int i = 2 ;i < Math.sqrt(num) ; i++){
                 if(num % 2 == 0){
                    return false;
                 }else{
                    continue;
                 }
             }
             return true;
             
         };
    }

    public static PerformOperation isPalindrome(){ //앞, 뒤 어느 쪽으로 읽어도 같아지는 숫자 찾기 
         return (int num) -> { 
             int r,sum = 0 , temp;  
             temp = num;
             while(num > 0){
                r = num % 10 ; //나머지, 일의 자리 부터 저장됨
                sum = (sum*10) + r; //거꾸로 뒤집어서 숫자를 만들어감   
                
                num /= 10;
             }

            if(temp == sum)
                return true;
            else
                return false;
             
         }; // 조건식이 여러 줄로 된 경우 중괄호로 묶고 마지막에 세미콜론을 넣는다.
    }
}
public class Solution {

    public static void main(String[] args) throws IOException {
        MyMath ob = new MyMath();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        
        PerformOperation op;
        boolean ret = false;
        String ans = null;
        
        while (T-- > 0) {
            String s = br.readLine().trim();
            StringTokenizer st = new StringTokenizer(s);
            int ch = Integer.parseInt(st.nextToken());
            int num = Integer.parseInt(st.nextToken());
            if (ch == 1) {
                op = ob.isOdd();
                ret = ob.checker(op, num);
                ans = (ret) ? "ODD" : "EVEN";
            } else if (ch == 2) {
                op = ob.isPrime();
                ret = ob.checker(op, num);
                ans = (ret) ? "PRIME" : "COMPOSITE";
            } else if (ch == 3) {
                op = ob.isPalindrome();
                ret = ob.checker(op, num);
                ans = (ret) ? "PALINDROME" : "NOT PALINDROME";
            }
            System.out.println(ans);
        }
    }
}

댓글 없음:

댓글 쓰기