백엔드/Java

Java 람다(Lambda)

짱뚱짱 2024. 10. 29. 09:00

- Lambda + Stream => 람다와 스트림
- javaScript arrowFunction(화살표함수)와 비슷한 형태
- Lambda : 람다식 (식을 단순하게 표현하는 방법)
                 외부 자료의 부수적인 영향(side effect)을 주지 않도록 구현하는 방법
- Stream : 자료의 대상과 관계없이 동일한 연산을 수행할 수 있도록 해주는 반복자
- 메서드 체이닝 기법을 사용
- Lambda functions : 익명클래스를 사용하여 쓰는 함수

람다식의 장점 람다식의 단점
- 코드 간결성
- 병렬처리 가능
- 불필요한 연산 최소화
- 가독성이 떨어짐
- 반복문 사용시 성능 저하

 


- 람다의 표현식

// javaScript
const name = ( ) => { } 

//java
( 매개변수 ) -> { 구현 }

 

 

- 매개변수가 1개면 ( ) 생략가능

x -> { return x + 1; }
(x, y) -> { return x + y; }

 

 

- return이 없으면 { } 생략가능

x -> x + 1;
x -> return x + 1; //오류

 

 

📢 실습(1) : 리스트 출력

package day09;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

public class Lambda01 {

    public static void main(String[] args) {
        // 정수 리스트 생성
        List<Integer> list = new ArrayList<>();
        
        // 리스트에 요소 추가
        list.add(10);
        list.add(20);
        list.add(40);
        list.add(60);
        list.add(30);
        list.add(50);
        list.add(70);
        list.add(80);
        list.add(90);
        
        // 1. 전통적인 for-each 루프를 사용하여 리스트의 요소 출력
        for (Integer tmp : list) {
            System.out.println(tmp); // 각 요소 출력
        }
        
        // 구분선 출력
        System.out.println("--forEach 출력--");
        
        // 2. 람다식을 사용하여 forEach 메서드로 리스트의 요소 출력
        list.forEach(n -> {
            System.out.println(n + " "); // 각 요소 출력
        });
        
        // 3. 주석 처리된 부분: 합계 계산 예제
        // int sum = 0;
        // list.forEach(n -> {
        //     sum += n; // 리스트의 모든 요소를 더함
        // });
        
        // 4. 람다함수(익명함수) 사용 예제
        System.out.println();
        System.out.println("--람다함수 사용 Consumer --");
        
        // Consumer 인터페이스를 사용하여 람다 함수 정의
        Consumer<Integer> method = (n) -> {
            System.out.println(n + " "); // 각 요소 출력
        };
        
        // forEach 메서드에 Consumer 람다 함수 전달
        list.forEach(method);
    }
}

 

 

결과

10
20
40
60
30
50
70
80
90
--forEach 출력--
10 
20 
40 
60 
30 
50 
70 
80 
90 

--람다함수사용 Consumer --
10 
20 
40 
60 
30 
50 
70 
80 
90

 

 

📢 실습(2) : HashMap 사용하여 데이터 처리

package day09;

import java.util.HashMap;

public class Lambda02 {

    public static void main(String[] args) {
        // HashMap을 생성하고 데이터 추가
        HashMap<String, Integer> map = new HashMap<>();
        map.put("hong", 70);
        map.put("kim", 53);
        map.put("lee", 98);
        map.put("park", 85);
        map.put("choi", 65);
        map.put("ha", 45);
        
        // 1. forEach 메서드를 사용하여 맵의 모든 키-값 쌍 출력
        // Consumer: 값이 1개, BiConsumer: 값이 2개
        map.forEach((key, value) -> {
            System.out.println(key + ":" + value); // 각 키-값 쌍 출력
        });
        
        // 2. 사용자 정의 함수형 인터페이스 사용 예제
        Number sum = (a, b) -> { // 함수 구현
            return a + b; // 두 수의 합 반환
        };
        
        // 3. 두 수의 합을 계산하고 출력
        int tot = sum.add(50, 60);
        System.out.println(tot); // 결과 출력
    }
}

// 4. 함수형 인터페이스 생성
// 메서드가 1개여야만 함.
@FunctionalInterface
interface Number {
    int add(int a, int b); // 두 수를 더하는 메서드
    // int sub(int a, int b); // 메서드가 2개면 오류 발생
}

 

 

결과

hong:70
choi:65
ha:45
lee:98
kim:53
park:85
110

 

 

'백엔드 > Java' 카테고리의 다른 글

Java 파일 입출력 (I/O) 처리  (0) 2024.11.04
Java 스트림(Stream)  (0) 2024.10.30
Java 제네릭(Generic)  (1) 2024.10.26
Java로 상품 관리 시스템 구현(2)  (0) 2024.10.25
Java로 단어장 구현  (0) 2024.10.23