어제 람다 스트림 이슈로
제가 람다에 대해서 얼마나 아는지 심심해서 ai한테 물어보니 한 20프로만 알고 썻더라구요@.@
1) 익명 함수(Anonymous Function) 대체
가장 기본적인 용도지.
Runnable r = () -> System.out.println("run");
익명 클래스를 간단히 표현하는 문법적 축약.
2) 함수를 인자로 넘기기 (고차 함수)
스트림에서 많이 보이지만, 스트림이 없어도 가능해.
public void doSomething(Function f) { System.out.println(f.apply("123")); }
람다의 핵심 목적 중 하나.
3) 콜백(callback) 구현
GUI, 이벤트, 비동기 처리에서 자주 쓰여.
button.setOnClick(e -> handleClick());
예전엔 ActionListener 익명 클래스로 길게 썼던 걸 람다로 간단히 표현.
4) 전략 패턴(Strategy Pattern) 간소화
디자인 패턴을 훨씬 간결하게 만들 수 있어.
예전 방식:
class AddStrategy implements Strategy { public int apply(int a, int b) { return a + b; } }
람다 방식:
Strategy add = (a, b) -> a + b;
전략 패턴이 사실상 “함수 하나”라서 람다와 궁합이 좋지.
5) 컬렉션 정렬, 비교자(Comparator) 간소화
람다 도입 이후 가장 많이 바뀐 부분 중 하나.
list.sort((a, b) -> a.getAge() - b.getAge());
예전엔 Comparator 익명 클래스로 길게 썼지.
6) 지연 실행(Lazy Execution) 또는 즉시 실행 제어
람다는 “코드를 값처럼” 넘길 수 있기 때문에,
실행 시점을 조절하는 데도 쓰여.
예:
Supplier lazy = () -> heavyOperation();
필요할 때만 실행할 수 있어.
✔ 7) Optional의 map/filter/orElseGet 같은 함수형 API
Optional도 스트림처럼 람다 기반 API야.
optional.map(x -> x + 1) .orElseGet(() -> 0);
✔ 8) CompletableFuture의 비동기 체인
비동기 프로그래밍에서도 람다가 핵심 역할을 해.
CompletableFuture.supplyAsync(() -> loadData()) .thenApply(data -> process(data)) .thenAccept(result -> System.out.println(result));
람다가 없으면 이런 API는 불가능했어.
✔ 9) 함수형 인터페이스(FI) 기반 DSL 구성
Spring, Reactor, Netty 같은 프레임워크들이
람다를 이용해 DSL 스타일 API를 만들기 시작했지.
코파일럿 정리
1번2번 만쓰고 전 전략패턴에서는 구디 안썻는데요; 참 사람은 배울게 많긴하네요;;