Java-8 (가장 큰 변혁)
Source: Dev.to
람다 표현식 (파트 1)
Java에서는 작은 로직 하나를 작성하더라도 매번 익명 클래스를 만들고 메서드를 오버라이드해야 했기 때문에 코드가 길어졌습니다. Java 8은 람다 표현식을 도입하여 짧고 깔끔하며 함수형 스타일로 코드를 작성할 수 있게 이 문제를 해결했습니다.
기본 문법
// 매개변수 없는 람다
() -> System.out.println("HI");
// 매개변수 하나인 람다
x -> x * x;
// 매개변수 두 개인 람다
(x, y) -> x * y;
// 블록 본문을 가진 람다
x -> {
int y = x + 1;
return y;
};
// 블록 본문을 가진 매개변수 없는 람다
() -> {
System.out.println("HI");
}
Java 8 이전
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Running");
}
}).start();
Java 8 이후
new Thread(() -> System.out.println("Running")).start();
변수 캡처
규칙: 캡처된 변수는 실질적으로 final 이어야 합니다.
int processedCount = 0;
orders.forEach(order -> {
processedCount++; // ❌ ERROR
});
Local variable
processedCountdefined in an enclosing scope must be final or effectively final.
해결 방법 1: AtomicInteger 사용
AtomicInteger processedCount = new AtomicInteger(0);
orders.forEach(order -> {
processedCount.incrementAndGet(); // ✔ Works
});
System.out.println(processedCount.get());
AtomicInteger는 객체이며, 레퍼런스는 final이지만 내부 값은 변경될 수 있습니다.
해결 방법 2: 배열 래퍼 사용
int[] processedCount = {0};
orders.forEach(order -> {
processedCount[0]++; // ✔ Works
});
배열 레퍼런스는 final이지만, 배열 요소는 변형될 수 있습니다.
해결 방법 3: Stream count 사용
long processedCount = orders.stream().count();
Java 8을 이해하는 데 도움이 되었길 바랍니다. 다음 글에서는 Java 8의 컬렉션에 대해 다룰 예정이니 놓치지 마세요!