람다식(Lambda)

jiji·2023년 11월 11일

JAVA

목록 보기
9/9

람다함수란?

  • 익명 함수(Anonymous Function)의 한 종류(이름을 가질 필요가 없다)
  • 함수를 하나의 식(expression)으로 표현한 것

장점

  1. 코드의 간결성
    : 반복문과 같은 복잡한 식을 단순하게 표현할 수 있습니다.
  2. 지연연산 수행
    : 불필요한 연산을 최소화 할 수 있습니다.
  3. 병렬처리 가능
    : 멀티스레딩을 활용해 병렬처리가 가능합니다.
  4. 필터링 및 매핑 시 집계 결과를 쉽게 가져올 수 있습니다. (내장된 메서드 사용 가능)

단점

  1. 람다식 호출이 까다롭습니다.
  2. 람다식의 stream 사용 시 단순 for문 혹은 while문 사용 시 성능이 떨어집니다.
  3. 불필요하게 너무 사용하게 되면 오히려 가동성을 떨어뜨릴 수 있습니다.

how

(매개변수) 화살표→ {함수 몸체}
() -> "Hello World!";
  • 단일 실행문일 경우 {괄호} 생략 가능 (함수 몸체가 return문으로만 구성 되어있는 경우 불가능)

  • 람다식 내에서 사용되는 지역변수는 final이 붙지 않아도 상수로 간주됩니다.
  • 람다식으로 선언된 변수명은 다른 변수명과 중복될 수 없습니다.

Stream API

  • .stream() 데이터의 흐름
  • .filter() 필터 조건에 맞는 데이터들을 필터링
  • .collect() stream의 데이터를 변형 등의 처리를 한 뒤, 원하는 자료형으로 변환
  • .sorted() 정렬
menuList.stream()
   	 .filter(dish -> dish.getCalories() > 300)  //필터
   	 .sorted(Comparator.comparing(d -> d.getCalories()))  //정렬
// 	 .sorted(Comparator.comparing(Dish::getCalories).reversed())  //정렬 리버스
   	 .limit(3)  // 추출
   	 .collect(toList())  // 변환
   	 .forEach(dish -> System.out.println(dish));  //출력문 for
  1. 스트림 생성
    컬렉션, 배열, 파일 등 다양한 소스로부터 스트림을 생성할 수 있습니다.
List<String> myList = Arrays.asList("Java", "Python", "JavaScript", "C++");

// 컬렉션으로부터 스트림 생성
Stream<String> streamFromList = myList.stream();

// 배열로부터 스트림 생성
String[] myArray = {"Apple", "Banana", "Orange"};
Stream<String> streamFromArray = Arrays.stream(myArray);
  1. 중간 연산
    스트림에 대해 여러 중간 연산을 수행하여 데이터를 필터링하고 변환할 수 있습니다.
List<String> result 
	= myList.stream()
       .filter(s -> s.startsWith("J"))
       .map(String::toUpperCase)
       .collect(Collectors.toList());

// 결과: ["JAVA", "JAVASCRIPT"]
  1. 최종 연산:
    스트림의 최종 연산을 통해 최종 결과를 얻습니다. 주로 수집(collect)이나 forEach와 같은 연산이 사용됩니다.
List<String> myList = Arrays.asList("Java", "Python", "JavaScript", "C++");

// forEach를 통해 각 요소 출력
myList.stream().forEach(System.out::println);
  1. 병렬 스트림:
    데이터를 병렬로 처리할 수 있는 기능을 제공합니다.
List<String> myList = Arrays.asList("Java", "Python", "JavaScript", "C++");

// 병렬 스트림 사용
myList.parallelStream().forEach(System.out::println);

0개의 댓글