지난 포스팅에 이어 계속 진행합니다.
지난번에는 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 (3) | 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 |