Backend/Backend 관련 학습 내용

Collection Framework API 이해 및 활용 & 람다와 스트림 API 활용

pjhcsol 2024. 11. 29. 19:39

람다식은 정말 다양한 곳에서 코드 양을 줄이고, 가독성을 높이는 과정에서 필수적으로 사용됩니다.

어떻게 사용하면 좋은 코드를 작성할 수 있을지 지속적으로 고민해보시길 바랍니다.

 

Part 2. Collection Framework API 이해 및 활용

CH3. 람다와 스트림 API 활용하기

  • 함수형 인터페이스
    개념:
    함수형 인터페이스는 오직 하나의 추상 메서드만을 가지는 인터페이스입니다. 이 인터페이스는 람다 표현식과 함께 사용되기 위해 설계되었습니다. 자바에서는 @FunctionalInterface 어노테이션을 사용하여 함수형 인터페이스임을 명시할 수 있습니다.
    예시:
    @FunctionalInterface
  • interface MyFunctionalInterface {
  •     void execute();
  • }
  • public class FunctionalInterfaceExample {
  •     public static void main(String[] args) {
  •         // 람다 표현식으로 함수형 인터페이스 구현
  •         MyFunctionalInterface func = () -> System.out.println("Hello, Functional Interface!");
  •         func.execute();  // 출력: Hello, Functional Interface!
  •     }
  • }
  • 함수형 인터페이스 메서드 참조
    개념:
    메서드 참조는 람다 표현식을 더 간결하게 작성할 수 있는 방법입니다. 특정 메서드를 직접 참조하여 함수형 인터페이스의 구현체로 사용할 수 있습니다. 메서드 참조는 :: 연산자를 사용합니다.
    예시:
    import java.util.function.Consumer;
  • public class MethodReferenceExample {
  •     public static void main(String[] args) {
  •         Consumer<String> printer = System.out::println;
  •         printer.accept("Hello, Method Reference!");  // 출력: Hello, Method Reference!
  •     }
  • }
  • 람다식이란 무엇인가
    개념:
    람다식은 익명 함수(anonymous function)를 생성하기 위한 식으로, 간결한 문법을 통해 코드의 가독성을 높여줍니다. 함수형 프로그래밍을 자바에서 보다 쉽게 사용할 수 있도록 해줍니다.
    예시:
    import java.util.function.BiFunction;
  • public class LambdaExample {
  •     public static void main(String[] args) {
  •         BiFunction<Integer, Integer, Integer> adder = (a, b) -> a + b;
  •         int result = adder.apply(5, 3);  // 결과: 8
  •         System.out.println("Sum: " + result);  // 출력: Sum: 8
  •     }
  • }
  • 람다식의 사용방법
    개념:
    람다식은 매개변수, 화살표(->), 그리고 함수 본문으로 구성됩니다. 매개변수의 타입을 생략할 수 있으며, 함수 본문이 단일 문장인 경우 중괄호도 생략할 수 있습니다.
    예시:
    import java.util.Arrays;
  • import java.util.List;
  • public class LambdaUsageExample {
  •     public static void main(String[] args) {
  •         List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
  •         // 간단한 람다식 사용 예제
  •         names.forEach(name -> System.out.println(name));
  •         // 출력:
  •         // Alice
  •         // Bob
  •         // Charlie
  •     }
  • }
  • Stream API의 이해
    개념:
    Stream API는 컬렉션을 처리하는 데 있어 선언적이고 함수형 프로그래밍 방식을 제공하는 도구입니다. 스트림은 데이터 소스(컬렉션, 배열 등)에서 요소들을 연속적으로 처리할 수 있는 추상화된 개념입니다.
    예시:
    import java.util.Arrays;
  • import java.util.List;
  • public class StreamAPIExample {
  •     public static void main(String[] args) {
  •         List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
  •         // 스트림을 사용하여 모든 이름을 대문자로 변환하고 출력
  •         names.stream()
  •             .map(String::toUpperCase)
  •             .forEach(System.out::println);
  •         // 출력:
  •         // ALICE
  •         // BOB
  •         // CHARLIE
  •     }
  • }
  • Stream API의 활용
    개념:
    Stream API를 활용하면 데이터를 필터링, 매핑, 정렬, 집계하는 등의 작업을 간편하게 수행할 수 있습니다. 스트림은 중간 연산과 최종 연산으로 구성되며, 중간 연산은 스트림을 반환하고 최종 연산은 결과를 반환하거나 출력을 수행합니다.
    예시:
    import java.util.Arrays;
  • import java.util.List;
  • import java.util.stream.Collectors;
  • public class StreamAPIUsageExample {
  •     public static void main(String[] args) {
  •         List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
  •         // 필터링: 이름이 'B'로 시작하는 이름만 선택
  •         List<String> filteredNames = names.stream()
  •                                           .filter(name -> name.startsWith("B"))
  •                                           .collect(Collectors.toList());
  •         System.out.println(filteredNames);  // 출력: [Bob]
  •         // 매핑: 이름의 길이를 리스트로 변환
  •         List<Integer> nameLengths = names.stream()
  •                                         .map(String::length)
  •                                         .collect(Collectors.toList());
  •         System.out.println(nameLengths);  // 출력: [5, 3, 7, 5]
  •         // 정렬: 이름을 알파벳 순서로 정렬
  •         List<String> sortedNames = names.stream()
  •                                         .sorted()
  •                                         .collect(Collectors.toList());
  •         System.out.println(sortedNames);  // 출력: [Alice, Bob, Charlie, David]
  •     }
  • }