java7에서 java8로 전환할 때 

특정 인터페이스가 하나의 메소드를 가지고 있을 때(포맷에 맞아야 함, Callable처럼) 깔끔히 처리될 수 있다. 


1) Callable(java.util.concurrent.Callable)을 쉽게 정리할 수 있다.




기존 코드


Callable<List<Help>> callable = new Callable<List<Help>>() {

@Override

public List<Help> call() throws Exception {

return jdbcTemplate.query("select id from helps");

}

};



return cacheTemplate.gets(CACHE_HELPS, callable, Help.class);




->

새코드 

return cacheTemplate.gets(CACHE_HELPS, () -> {jdbcTemplate.query("select id from helps"); }, Help.class);






2) Runnable을 쉽게 정리할 수 있다.

 

기존 코드 

class MyRunnable implements Runnable {

List<FeedItem> myFeedItems;

public MyRunnable(List<FeedItem> feedItems) {

myFeedItems = feedItems;

}


@Override

public void run() {

saveFeedStat(myFeedItems);

}

}


public void saveFeedStatAsync(final List<FeedItem> feedItems) {

Runnable worker = new MyRunnable(feedItems);

executor.execute(worker);

}


 

=>

새 코드 

public void saveFeedStatAsync(final List<FeedItem> feedItems) {

Runnable talk = () -> { saveFeedStat(feedItems); };

executor.execute(talk);

}




3) 하나의 인터페이스를 가진 interface에 FunctionalInterface를 사용할 수 있다. 


기존 코드



public interface MessageCallable<T, V> {

List<V> call(Collection<T> ids);

}


    

public List<Message> findAll() {

Callable<List<Message>> callable = new MessageCallable<List<Message>>() {

@Override

public List<Message> call() throws Exception {

return _findAll();

}

};

return cacheTemplate.gets(CACHE_MESSAGE, callable, Message.class);

}


=>


새로운 코드 


@FunctionalInterface

public interface MessageCallable<T, V> {

List<V> call(Collection<T> ids);

}


 

public List<EmoticonMessage> findAll() {

return cacheTemplate.gets(MESSAGE, () -> {return _findAll();}, Message.class);

}




4) Guava 코드도 쉽게 정리할 수 있다.


List<String> activityIds = Lists.transform(items, new Function<ActionGraphItemParsed, String>() {

@Override

public String apply(ActionGraphItemParsed item) {

return item.activityId;

}

});


->



List<String> activityIds = Lists.transform(items, (ActionGraphItemParsed item) -> {

return item.activityId;

});



또 다른 예시이다.



public static final Predicate<String> BLANK_STRING_FILTER = new Predicate<String>() {

@Override

public boolean apply(String url) {

return StringUtils.isNotBlank(url);

}

};

-> 

public static final Predicate<String> BLANK_STRING_FILTER = (String url) -> {

return StringUtils.isNotBlank(url);

};











'java core' 카테고리의 다른 글

[java8] 람다 사용시 스칼라와 자바의 블럭 차이  (0) 2017.04.21
java의 volatile  (0) 2017.04.17
람다를 활용한 java8의 Callable, Runnable 예제  (0) 2017.03.27
java9에서 사라지는 gc  (0) 2017.03.20
jnr  (0) 2017.02.27
Posted by '김용환'
,