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);
}
기존 코드
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 |