Dev/Java

Java8 new features

마이스토리 2016. 3. 8. 10:23

▶New features

http://www.moreagile.net/2014/04/AllAboutJava8.html


http://blog.fupfin.com/?p=27


▶ 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

http://jinson.tistory.com/entry/%ED%95%9C%EA%B8%80%ED%99%94-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B85%EC%9E%90%EB%B0%94%EC%97%90%EC%84%9C-%EB%9E%8C%EB%8B%A4-%EC%8B%9D%EC%9D%B4-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0-1


자바에서 람다 식이 필요한 이유 – 2


http://jinson.tistory.com/entry/%ED%95%9C%EA%B8%80%ED%99%94-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-5-%EB%9E%8C%EB%8B%A4%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0-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 사용 시.

}

}