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]
- }
- }