본문으로 바로가기

Java 8 Lambda Expression - 람다식 #2

category 개발이야기/Java 2017. 9. 12. 22:27
반응형

지난 포스팅에 이어 계속 진행합니다.

지난번에는 Strategy pattern을 람다식을 사용하면서 코드를 간결하게 변경시키는 방법을 봤습니다. 

이번에는 가장 간단하게 람다식을 쓰는 방법에 대해 언급합니다.


익명클래스 (anonymous class)의 치환 - Comparator

Lambda를 사용하는 가장 간단한 방법으로 익명클래스를 람다로 치환할 수 있습니다. 

new class...로 시작하는 불필요한 부분은 제거하고, 필요한 부분만 람다로 표현합니다. 


이전 포스팅에서 상품List의 을 가격으로 정렬하려면 Collection.sort(List, Comparator<T>)를 사용해야 합니다. 

이전 포스팅에서 사용한 person 객체및 해당 list 생성 코드 입니다.


public class Product {
    private String mName;
    private int mPrice;
    private boolean mIsFood;
    private String mMadeBy;
    private String mStore;

    public Product(String name, int price, boolean food, String madeby, String storeName) {
        mName = name;
        mPrice = price;
        mIsFood = food;
        mMadeBy = madeby;
        mStore = storeName;
    }

    public String getName() {
        return mName;
    }

    public int getPrice() {
        return mPrice;
    }

    public boolean isFood() {
         return mIsFood;
    }

    public String getMadeBy() {
	return mMadeBy;
    }

    public String getStore() {
	return mStore;
    }
}

public static void main(String[] args) {
	ArrayList<Product> products = new ArrayList<>();
	products.add(new Product("새우깡", 1200, true, "농심", "이마트"));
	products.add(new Product("감자깡", 1200, true, "농심", "이마트"));
	products.add(new Product("양파링", 1000, true, "농심", "홈플러스"));
	products.add(new Product("고구마칩", 3000, true, "오리온", "홈플러스"));
	products.add(new Product("자갈치", 800, true, "오리온", "홈플러스"));
	products.add(new Product("가위", 4000, false, "문방구", "코스트코"));
	products.add(new Product("청소기", 70000, false, "LG", "코스트코"));
	products.add(new Product("양주", 30000, true, "진로", "코스트코"));
	products.add(new Product("곰젤리", 4000, true, "Bear", "코스트코"));

    ...


먼저 sort를 하기위해 만든 코드 입니다. 

Collections.sort(products,
    new Comparator<Product>() {
	@Override
    	public int compare(Product proc1, Product proc2) {
	    return proc1.getPrice() - proc2.getPrice();				
	}
});

Comparator는 익명 클래스로 만들어서 사용했으며, 여기서 중요한 부분은 compare()함수 내부의 로직입니다. 

따라서 람다로는 아래와 같이 한줄로 표현할 수 있습니다. 

products.sort(
         (Product proc1, Product proc2) -> proc1.getPrice() - proc2.getPrice());


눈치 채셨는지요?

위 예제는 Collections.sort()가 아닌 product.sort()를 사용했습니다. 즉 List.sort()를 사용한건데, Java8 부터는 List<T> interface에 sort()가 default method로 추가 되었기 때문입니다.

Default method의 자세한 내용은 아래에서 확인할 수 있습니다.

http://blog.naver.com/pionio2/220701847980 


추가적으로 예제의 sort는 더 간략하게 바꿀 수 있습니다.

sort에 대한 상세 내용은 아래 포스팅에서 확인 할 수 있습니다만 그전에 람다의 기본 사용방법을 끝내고 보시는걸 추천합니다.

http://blog.naver.com/pionio2/221074792128


익명클래스 (anonymous class)의 치환 - onClickListener

다른 예로 android에서 엄청나게 사용하는 onClickListener도 아래와 같이 람다로 치환할 수 있습니다. 

// 치환전 코드
textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       System.out.println("Click!!");
   }
});	
// 치환후 코드
textView.setOnClickListener((View v) -> System.out.println("Click!!"));


View 객체를 따라가 보면 onClickListener는 아래와 같은 interface 입니다. 

/**
 * Interface definition for a callback to be invoked when a view is clicked.
 */
public interface OnClickListener {
    /**
     * Called when a view has been clicked.
     *
     * @param v The view that was clicked.
     */
    void onClick(View v);
}

abstract method가 한개인 interface이기 때문에 OnClickListener는 FunctionalInterface 입니다.

따라서 람다식으로 치환 가능합니다.


익명클래스 (anonymous class)의 치환 - Thread

마지막으로 thread 생성을 Lambda로 해 보겠습니다. 

thread 생성시 구현해서 사용하는 Runnable interface는 public abstract void run()을 구현해야 합니다. 

run() 함수의 signature는 () -> void 입니다. 

// 치환전 코드
Thread th = new Thread(new Runnable() {
    @Overrie
    public void run() {
        System.out.println("Normal thread!!"));
    }
});
// 치환 후 코드
Thread th = new Thread(() -> System.out.println("Lambda in thread!!"));	


마찬  가지고 Callable은 call 함수 하나만 같는 functional interface이므로 람다식으로 표현 할 수 있습니다.

method signature는 () -> R 입니다. 직접 해보시기 바랍니다.


다음 포스팅엔 람다, functionalInterface의 정의 람다의 특성및 method reference에서 다룹니다.

반응형

'개발이야기 > Java' 카테고리의 다른 글

Java 8 Comparator  (0) 2017.09.14
Java 8 String join  (2) 2017.09.13
Java 8 Lambda Expression - 람다식 #4  (0) 2017.09.12
Java 8 Lambda Expression - 람다식 #3  (0) 2017.09.12
Java 8 Lambda Expression - 람다식 #1  (1) 2017.09.09