Post

자바 Lambda와 Stream API 요약

자바 Lambda와 Stream API 요약

Lambda 표현식

람다 표현식은 자바 8에서 도입되어 함수형 인터페이스를 구현할 때 사용된다. 람다 표현식을 사용하면 코드를 더욱 간결하고 읽기 쉽게 작성할 수 있다.

예제 1: Lambda 표현식 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.Arrays;
import java.util.List;

public class LambdaDemo8 {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("사과", "배", "딸기", "복숭아", "레몬", "망고", "수박");
        
        // 첫 번째 방법: 인덱스를 이용한 반복문
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + ", ");
        }
        System.out.println();
        
        // 두 번째 방법: 향상된 for문
        for (String str : list) {
            System.out.print(str + ", ");
        }
        System.out.println();
        
        // 세 번째 방법: forEach와 람다 표현식
        list.forEach(str -> System.out.print(str + ", "));
    }
}

Stream API

스트림 API는 자바 8에서 도입되어 배열이나 컬렉션의 데이터를 일관되게 처리할 수 있는 강력한 도구를 제공한다. 스트림은 데이터의 흐름을 나타내며, 중간 연산과 최종 연산을 통해 데이터를 처리할 수 있다.

예제: 난수 스트림과 범위 합계

다음 예제는 난수를 생성하여 출력하고, 1부터 100까지의 합계를 계산하는 코드를 보여준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Random;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;

public class StreamDemo1 {
    public static void main(String[] args) {
        // 난수를 포함하는 DoubleStream 생성
        DoubleStream ds = new Random().doubles(3L, 1.0, 10.0);
        ds.forEach(d -> System.out.print(d + ", "));
        System.out.println();

        // 1부터 100까지의 합계를 계산
        int result = IntStream.rangeClosed(1, 100).sum();
        System.out.println(result);
    }
}

스트림 생성 방법

다양한 방법으로 스트림을 생성할 수 있다.

  1. 배열로부터 스트림 생성
1
2
3
4
5
Integer[] intArray = {1, 2, 3, 4, 5};
Stream<Integer> s1 = Stream.of(intArray);

String[] strArray = {"사과", "배", "딸기", "복숭아", "레몬", "망고", "수박"};
Stream<String> s2 = Stream.of(strArray);
  1. Arrays.stream 메소드를 이용한 스트림 생성
1
2
Stream<Integer> s3 = Arrays.stream(intArray);
Stream<String> s4 = Arrays.stream(strArray);
  1. 컬렉션으로부터 스트림 생성
1
2
3
4
5
6
7
8
List<String> list = Arrays.asList("사과", "배", "딸기", "복숭아", "레몬", "망고", "수박");
Stream<String> s5 = list.stream();

List<Integer> list1 = Arrays.asList(3, 4, 7, 1, 2, 3);
Stream<Integer> s6 = list1.stream();

Set<String> set = new HashSet<>(Arrays.asList("사과", "배", "딸기", "복숭아", "레몬", "망고", "수박"));
Stream<String> s7 = set.stream();
  1. 지정된 범위를 이용한 스트림 생성
1
2
IntStream is = IntStream.range(1, 11); // 1부터 10까지 (끝번호는 포함되지 않음)
DoubleStream ds = DoubleStream.of(10.5); // 하나의 요소 10.5
  1. 난수를 이용한 스트림 생성
1
2
DoubleStream ds1 = new Random().doubles(15L, 1.0, 10.0); // 1.0부터 10.0까지의 난수 15개
IntStream is1 = new Random().ints(5, 1, 10); // 1부터 10까지의 난수 5개

스트림 연산

  • 중간 연산 (Intermediate Operations): 필터링, 매핑 등과 같이 스트림을 변환하며, 다른 스트림을 반환한다. 예를 들면 filter, map 등이 있다.
  • 최종 연산 (Terminal Operations): 스트림을 사용하여 최종 결과를 반환한다. 예를 들어 forEach, sum, collect 등이 있다.

스트림은 원본 데이터를 변경하지 않으며, 지연 연산(lazy evaluation)을 통해 필요할 때만 데이터를 처리한다. 이를 통해 효율적인 데이터 처리가 가능하다.

This post is licensed under CC BY 4.0 by the author.

© sseung. Some rights reserved.