Java8 new features
▶New features
http://www.moreagile.net/2014/04/AllAboutJava8.html
▶ Lamda 표현식
http://yish-foss.blogspot.jp/2014/06/java-8-lambda.html
http://www.oracle.com/kr/corporate/magazines/winter-tech2-1429486-ko.pdf
자바에서 람다 식이 필요한 이유 – 1
자바에서 람다 식이 필요한 이유 – 2
※ 샘플코드
/**
* 기존 코드에서 람다식으로 변환하는 과정에 대한 예
* @author Administrator
*/
public class LamdaSample {
public static void main(String[] args) {
/*
* 1-10 의 배열에서 2보다 큰수, 7보다 작은 수들만 추출하는 것이 목적
*/
//===========================================================
// 전통적 코딩방식 예
//===========================================================
final List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
List<Integer> result1 = new ArrayList<>();
for(Integer number : list){
if (number > 2){
result1.add(number);
}
}
System.out.println(result1);
List<Integer> result2 = new ArrayList<>();
for(Integer number : list){
if (number < 7){
result2.add(number);
}
}
System.out.println(result2);
//===========================================================
// 익명 클래스 방법 코딩 예
//===========================================================
List<Integer> result3 = filter(list, new Predicate<Integer>() {
@Override
public boolean test(Integer integer) {
return integer > 2;
}
});
System.out.println(result3);
List<Integer> result4 = filter(list, new Predicate<Integer>() {
@Override
public boolean test(Integer integer) {
return integer < 7;
}
});
System.out.println(result4);
//===========================================================
// 람다식 코딩 예
//===========================================================
List<Integer> result5 = filter(list, n -> n > 2);
System.out.println(result5);
List<Integer> result6 = filter(list, n -> n < 7);
System.out.println(result6);
//===========================================================
// 람다식 응용. 함수조합
//===========================================================
final Predicate<Integer> greaterThen2 = n -> n > 2;
final Predicate<Integer> lessThen7 = n -> n < 7;
List<Integer> result7 = filter(list, greaterThen2.and(lessThen7));
System.out.println(result7);
}
private static <T> List<T> filter(List<T> list, Predicate<T> predicate){
List<T> result = new ArrayList<>();
for(T value : list){
if (predicate.test(value)){
result.add(value);
}
}
return result;
}
}
/**
* race condition 상황과 병렬처리 예
* @author Administrator
*
*/
public class RaceConditionAndParallelSample {
public static void main(String[] args) {
//아래와 같이 병렬처리하면 race condition에 빠짐
int[] sum = new int[1];
Arrays.asList(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
.parallelStream()
.forEach(i -> sum[0] = sum[0] + i); //클로저가 참조하는 외부 free variable은 변경할 수 없음으로 편법으로 배열로 처리
System.out.println(sum[0]);
//아래와 같이 처리.
int total = Arrays.asList(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
.parallelStream()
.reduce(0, (i1, i2) -> i1 + i2);
System.out.println(total);
//일반 처리와 병렬 처리의 차이 구현
long start = System.currentTimeMillis();
int total2 = Arrays.asList(1,2,3,4,5,6,7,8)
// .stream()
.parallelStream()
.peek(i -> {
try {
TimeUnit.SECONDS.sleep(4);
} catch (Exception e) {
e.printStackTrace();
}
})
.reduce(0, (i1, i2) -> i1 + i2);
System.out.println("It took " + (System.currentTimeMillis() - start));
System.out.println(total);
//이미 정렬된 배열을 parallelStream으로 정렬하면 더 느림.
//하이버네이트 같은 ORM을 쓸 경우 경우에 따라 parallelStream을 더 느림. 예) lazy loading 사용 시.
}
}