[기술정리] Lamda

Stupefyee's avatar
Nov 20, 2024
[기술정리] Lamda

1. 개요

  • 목적:
    • 간결한 함수형 인터페이스 구현
  • 특징:
    • 익명 함수, 코드 간결화, 함수형 프로그래밍 지원

2. 람다 기본 문법

(매개변수) -> { 실행 코드 }
  • 매개변수:람다에 전달되는 값
  • >:매개변수와 실행 코드 구분
  • 실행 코드:람다에서 실행할 코드

3. 예시 코드

1. MySupplier.java

// 입력 없이 값을 반환(return) @FunctionalInterface // 람다인터페이스로 사용할 때 붙이는 어노테이션 public interface MySupplier<T> { T get(); }

2. MyComsumer.java

// 입력만 받고 출력이 없는 연산을 수행 public interface MyConsumer<T> { void accept(T data); }

3. MyFunction.java

// 입력을 받아서 결과를 반환 // T는 파라미터의 타입, R은 리턴 타입 public interface MyFunction<T,R> { R apply(T t); }

4. MyPredicate.java

// 입력을 받아서 논리값(boolean)을 리턴 public interface MyPredicate<T> { boolean apply(T t); }

5. 람다 연습 App.java

// 1. 람다는 인터페이스로 만든다 // 2. 인터페이스에는 메서드가 하나만 존재해야 한다. // 3. 메서드가 인터페이스를 매개변수(파라미터)로 받고 있으면, 행위를 주세요! // 4. 람다에서는 매개변수에 타입이 생략 가능하다. // 5. @FunctionalInterface로 람다 인터페이스 표시 가능 // 람다식과 람다표현식의 차이점 >> 람다표현식은 return을 하지만 람다식은 안함 >> return의 유무 public class App { public static void main(String[] args) { // 람다식 MyConsumer<Integer> r1 = (data) -> { System.out.println("소비할 데이터 r1: " + data); }; r1.accept(1); // 람다표현식 MySupplier<String> r2 =() -> {return "good";}; MySupplier<String> r3 =() -> "good"; // return은 생략가능 String msg = r3.get(); System.out.println("r3: " + msg); MyFunction<Integer, Double> r4 = (x) -> { return x / 1.5; }; System.out.println("r2: " + r4.apply(3)); MyPredicate<Integer> r5 = integer -> integer % 2 == 0; System.out.println("r5: " + r5.apply(1)); } }

6. 출력물

💡
소비할 데이터 r1: 1 r3: good r2: 2.0 r5: false

4. 람다 사용 예시

1.리스트 필터링

List<String> list = Arrays.asList("apple", "banana", "cherry"); list.forEach(item -> System.out.println(item));
  • 리스트의 각 요소 출력

2. 컬렉션 정렬

List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5); numbers.sort((a, b) -> a - b);
  • 정렬 기준으로 람다 사용

5. 함수형 인터페이스

  • 정의:하나의 추상 메소드만 가진 인터페이스
  • 예시:Runnable, Callable, Comparator

6. 주요 람다 사용 예

  1. forEach()
    1. 컬렉션의 각 요소에 대해 람다 실행
      list.forEach(item -> System.out.println(item));
  1. map()
    1. 컬렉션의 각 요소 변환
      list.stream().map(item -> item.toUpperCase()).forEach(System.out::println);
  1. filter()
    1. 조건에 맞는 요소 필터링
      list.stream().filter(item -> item.startsWith("a")).forEach(System.out::println);

7. 람다 장점

  • 간결한 코드
  • 가독성 향상
  • 함수형 프로그래밍 지원
  • 변경 불가능한 코드 (불변성)

8. 람다 단점

  • 디버깅 어려움
  • 과도한 사용 시 코드 가독성 저하
  • 상태 변화가 필요한 로직에 적합하지 않음

9. 람다와 익명 클래스 비교

항목
람다 표현식
익명 클래스
코드 길이
짧고 간결
상대적으로 길고 복잡함
가독성
좋음
복잡하고 읽기 어려움
상태 변경
불변성 유지 가능
상태를 변경할 수 있음
성능
더 나은 성능
비슷하지만 더 많은 객체 생성
Share article

stupefyee