본문 바로가기
Java

[Java] Stream 사용법

by IronAreum 2024. 12. 2.
728x90

Java 스트림 API: Arrays.stream과 mapToLong(Long::parseLong) 완벽 이해

Arrays.streammapToLong(Long::parseLong) 같은 함수는 자바 스트림(Stream) API를 사용하는 방식 중 하나입니다. 스트림은 데이터를 처리하는 연속된 함수 호출 체인을 의미하며, 함수형 프로그래밍(Functional Programming)의 개념을 기반으로 동작합니다.

아래에서 하나씩 자세히 설명해 볼게요.


1. Arrays.stream 이란?

  • 배열을 스트림으로 변환하는 메서드입니다.
  • 스트림은 데이터를 하나씩 처리하는 추상적인 개념으로, 데이터를 필터링, 변환, 수집 등의 작업을 할 때 사용됩니다.

사용법

Arrays.stream(배열)

예제

int[] arr = {1, 2, 3, 4, 5};
Arrays.stream(arr) // 배열 -> 스트림
      .forEach(System.out::println); // 각 요소 출력

2. mapToLong이란?

  • 스트림 내부의 데이터를 다른 타입으로 변환하는 작업을 수행합니다.
  • mapToLong데이터를 long 타입으로 변환할 때 사용합니다.

왜 사용하는가?

  • 입력 데이터가 문자열(String)이라면, 이를 숫자(long)로 변환해야 계산 등에 활용할 수 있습니다.
  • 스트림 연산 중 변환 작업은 map 계열 메서드로 처리합니다.

mapToLong 기본 구조

스트림.mapToLong(변환함수)

예제

String[] numbers = {"10", "20", "30"};
long[] longs = Arrays.stream(numbers) // 스트림 생성
                     .mapToLong(Long::parseLong) // String -> long 변환
                     .toArray(); // long[]으로 변환

여기서 Long::parseLong은?

  • 메서드 참조(Method Reference): 기존 메서드를 간결하게 호출하는 문법.
    • Long::parseLong은 Long 클래스의 parseLong 메서드를 참조합니다.
    • 동작 방식: x -> Long.parseLong(x)와 동일.

3. 스트림 처리의 전체 과정

스트림을 사용하는 작업은 크게 세 단계로 나뉩니다.

  1. 생성: 데이터를 스트림으로 변환.
    • 예: Arrays.stream(array)
  2. 중간 연산: 데이터를 변환하거나 필터링.
    • 예: .mapToLong(Long::parseLong)
  3. 최종 연산: 데이터를 수집하거나 출력.
    • 예: .toArray() (배열로 반환), .forEach() (출력)

728x90

전체 예제

입력값을 long[]로 변환하는 예제를 다시 작성합니다.

예제

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String input = "10 20 30 40 50"; // 공백으로 구분된 문자열
        long[] numbers = Arrays.stream(input.split(" ")) // 공백으로 나눔 -> 스트림 생성
                               .mapToLong(Long::parseLong) // 각 문자열을 long으로 변환
                               .toArray(); // long[]로 변환

        // 결과 출력
        for (long num : numbers) {
            System.out.println(num);
        }
    }
}

한 줄씩 이해

  1. input.split(" ")
    • 문자열을 공백 기준으로 나눠 String[] 생성.
  2. Arrays.stream(...)
    • 문자열 배열을 스트림으로 변환.
  3. .mapToLong(Long::parseLong)
    • 각 문자열을 long 타입으로 변환.
  4. .toArray()
    • 변환된 데이터를 long[]로 반환.

연습 포인트

  1. map과 mapToLong 차이점
    • map: 데이터를 변환하지만 타입은 유지 (일반적으로 Stream 유지).
    • mapToLong: 데이터를 long 타입으로 변환 (LongStream 반환).
  2. 메서드 참조 (Class::Method)
    • 익숙해질 때까지 x -> Long.parseLong(x)로 연습해 보세요.
    • 이후 Long::parseLong처럼 간결한 형태를 사용하면 됩니다.

Tip

초반엔 익숙하지 않을 수 있지만, 스트림 API를 활용하면 코드가 깔끔해지고 반복적인 작업이 줄어듭니다. 기본적인 예제부터 차근차근 따라 하다 보면 금방 익숙해질 거예요! 😊

 

728x90