Java Stream API를 배우는 방법 [+5 Resources]

Java의 스트림은 순차 또는 병렬 작업을 수행할 수 있는 일련의 요소입니다.

“n”개의 중간 작업이 있을 수 있으며 마지막으로 결과가 반환된 후 최종 작업이 있을 수 있습니다.

스트림이란 무엇입니까?

스트림은 Java 8에 도입된 Stream API로 관리할 수 있습니다.

일부 상품을 제조, 분류 및 선적을 위해 포장해야 하는 제조 파이프라인으로 Stream을 상상해 보십시오. Java에서 이러한 상품은 개체 또는 개체 모음이며 작업은 제조, 분류 및 포장이며 파이프라인은 스트림입니다.

스트림의 구성 요소는 다음과 같습니다.

  • 초기 입력
  • 중간 작업
  • 터미널 운영
  • 최종 결과

Java에서 스트림의 몇 가지 기능을 살펴보겠습니다.

  • 스트림은 메모리 내 데이터 구조가 아닙니다. 오히려 배열, 개체 또는 특정 메서드에 의해 작동되는 개체 컬렉션의 시퀀스입니다.
  • 스트림은 본질적으로 선언적입니다. 즉, 수행할 작업은 지정하지만 수행 방법은 지정하지 않습니다.
  • 어디에도 저장되지 않기 때문에 한 번만 소비할 수 있습니다.
  • Stream은 원래 데이터 구조를 수정하지 않습니다. 그것은 단지 그것으로부터 새로운 구조를 도출할 뿐입니다.
  • 파이프라인의 최종 메서드에서 파생된 최종 결과를 반환합니다.

스트림 API 대 컬렉션 처리

컬렉션은 데이터를 저장하고 처리하는 메모리 내 데이터 구조입니다. 컬렉션은 데이터를 저장하기 위해 Set, Map, List 등과 같은 데이터 구조를 제공합니다. 반면 스트림은 데이터를 파이프라인을 통해 처리한 후 효율적으로 전달하는 방식이다.

다음은 ArrayList 컬렉션의 예입니다.

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(0, 3);
        System.out.println(list);
    }
}

Output: 
[3]

위의 예에서 볼 수 있듯이 ArrayList 컬렉션을 만들고 데이터를 저장한 다음 다른 방법을 사용하여 해당 데이터에 대해 작업을 수행할 수 있습니다.

  Excel 테마로 시간을 절약하는 방법

스트림을 사용하면 기존 데이터 구조에서 작업을 수행하고 수정된 새 값을 반환할 수 있습니다. 다음은 ArrayList 컬렉션을 생성하고 스트림을 사용하여 필터링하는 예입니다.

import java.util.ArrayList;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList();

        for (int i = 0; i < 20; i++) {
            list.add(i+1);
        }

        System.out.println(list);

        Stream<Integer> filtered = list.stream().filter(num -> num > 10);
        filtered.forEach(num -> System.out.println(num + " "));
    }
}

#Output

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

위의 예에서 스트림은 기존 목록을 사용하여 생성되고 목록은 10보다 큰 값을 필터링하기 위해 반복됩니다. 스트림은 아무 것도 저장하지 않고 목록이 반복되고 결과가 인쇄됩니다. 스트림을 인쇄하려고 하면 값 대신 스트림에 대한 참조를 얻게 됩니다.

자바 스트림 API 작업

Java Stream API는 요소의 소스 컬렉션 또는 요소 시퀀스를 가져온 다음 작업을 수행하여 최종 결과를 도출합니다. 스트림은 일련의 요소가 통과하고 어떤 식으로든 변환되는 파이프라인일 뿐입니다.

다음을 비롯한 다양한 소스에서 스트림을 생성할 수 있습니다.

  • List 또는 Set과 같은 컬렉션입니다.
  • 배열.
  • 버퍼를 사용하여 파일 및 해당 경로에서.

스트림에서 수행되는 두 가지 유형의 작업이 있습니다.

  • 중간 작업
  • 터미널 운영

중간 대 터미널 작업

각 중간 작업은 지정된 메서드를 사용하여 입력을 변환하는 새 스트림을 내부적으로 반환합니다. 실제로 통과되는 것은 없습니다. 대신 다음 스트림으로 전달됩니다. 원하는 결과를 얻기 위해 스트림이 순회되는 것은 터미널 작업에서만 가능합니다.

예를 들어 필터링한 다음 무언가에 매핑하려는 10개의 숫자 목록이 있습니다. 목록의 모든 요소가 필터링된 결과를 가져오고 다른 항목에 매핑하기 위해 즉시 순회되는 것은 아닙니다. 대신 개별 요소가 확인되고 조건을 충족하면 매핑됩니다. 각각의 모든 요소에 대한 새로운 스트림.

맵 작업은 전체 목록이 아닌 필터를 만족하는 개별 항목에 대해 수행됩니다. 그리고 단말 동작 시에는 순회되어 하나의 결과로 결합된다.

  Mullvad VPN으로 완벽한 익명성 [Hands-on Testing & Review]

터미널 작업을 수행한 후에는 스트림이 소비되며 더 이상 사용할 수 없습니다. 동일한 작업을 다시 수행하려면 새 스트림을 만들어야 합니다.

출처: The Bored Dev

스트림이 작동하는 방식에 대한 표면 수준의 이해를 바탕으로 Java에서 스트림의 구현 세부 사항으로 이동하겠습니다.

#1. 빈 스트림

Stream API의 empty 메서드를 사용하여 빈 스트림을 만듭니다.

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream emptyStream = Stream.empty();
        System.out.println(emptyStream.count());
    }
}

Output:
0

여기에서 이 스트림의 요소 수를 인쇄하면 요소가 없는 빈 스트림이기 때문에 출력으로 0을 얻습니다. 빈 스트림은 null 포인터 예외를 피하는 데 매우 유용합니다.

#2. 컬렉션에서 스트리밍

Lists 및 Set과 같은 컬렉션은 컬렉션에서 스트림을 만들 수 있는 stream() 메서드를 노출합니다. 그런 다음 생성된 스트림을 순회하여 최종 결과를 얻을 수 있습니다.

ArrayList<Integer> list = new ArrayList();

for (int i = 0; i < 20; i++) {
    list.add(i+1);
}

System.out.println(list);

Stream<Integer> filtered = list.stream().filter(num -> num > 10);
filtered.forEach(num -> System.out.println(num + " "));

#Output

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

#삼. 배열에서 스트림

Arrays.stream() 메서드는 배열에서 스트림을 만드는 데 사용됩니다.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String[] stringArray = new String[]{"this", "is", "koreantech.org"};
        Arrays.stream(stringArray).forEach(item -> System.out.print(item + " "));
    }
}

#Output

this is koreantech.org 

스트림을 만들 요소의 시작 및 끝 인덱스를 지정할 수도 있습니다. 시작 인덱스는 포괄적이고 종료 인덱스는 배타적입니다.

String[] stringArray = new String[]{"this", "is", "koreantech.org"};
Arrays.stream(stringArray, 1, 3).forEach(item -> System.out.print(item + " "));

Output:
is koreantech.org

#4. 스트림을 사용하여 최소 및 최대 숫자 찾기

컬렉션 또는 배열의 최대 및 최소 수에 액세스하는 것은 Java의 Comparators를 사용하여 수행할 수 있습니다. min() 및 max() 메서드는 비교자를 허용하고 선택적 개체를 반환합니다.

선택적 개체는 null이 아닌 값을 포함하거나 포함하지 않을 수 있는 컨테이너 개체입니다. null이 아닌 값을 포함하는 경우 get() 메서드를 호출하면 값이 반환됩니다.

import java.util.Arrays;
import java.util.Optional;

public class MinMax {
    public static void main(String[] args) {
        Integer[] numbers = new Integer[]{21, 82, 41, 9, 62, 3, 11};

        Optional<Integer> maxValue = Arrays.stream(numbers).max(Integer::compare);
        System.out.println(maxValue.get());

        Optional<Integer> minValue = Arrays.stream(numbers).min(Integer::compare);
        System.out.println(minValue.get());
    }
}

#Output
82
3

학습 리소스

이제 Java의 Streams에 대해 기본적으로 이해했으므로 다음은 Java 8에 정통할 수 있는 5가지 리소스입니다.

  Apple ID의 국가 또는 지역을 변경하는 방법

#1. 자바 8 실행

이 책은 스트림, 람다 및 기능적 스타일 프로그래밍을 포함하여 Java 8의 새로운 기능을 보여주는 가이드입니다. 퀴즈와 지식 확인 질문도 책의 일부로 학습한 내용을 복습하는 데 도움이 됩니다.

아마존에서 이 책을 페이퍼백 형식과 오디오북 형식으로 구할 수 있습니다.

#2. 자바 8 람다: 대중을 위한 함수형 프로그래밍

이 책은 핵심 Java SE 개발자에게 Lambda 표현식 추가가 Java 언어에 미치는 영향을 가르치기 위해 특별히 고안되었습니다. 여기에는 Java 8 람다 식을 마스터할 수 있는 유연한 설명, 코드 연습 및 예제가 포함되어 있습니다.

페이퍼백 형식과 Amazon의 Kindle 에디션으로 제공됩니다.

#삼. 정말 참을성이없는 Java SE 8

숙련된 Java SE 개발자인 경우 이 책은 Java SE 8의 개선 사항, 스트림 API, 람다 표현식 추가, Java의 동시 프로그래밍 개선 사항 및 대부분의 사람들이 이해하지 못하는 일부 Java 7 기능을 안내합니다. 에 대해 알지 못합니다.

Amazon에서 페이퍼백 형식으로만 제공됩니다.

#4. Lambdas 및 Streams를 사용한 Java 함수형 프로그래밍 배우기

Udemy의 이 과정은 Java 8 및 9의 기능적 프로그래밍의 기본 사항을 탐구합니다. 람다 식, 메서드 참조, 스트림 및 기능적 인터페이스는 이 과정에서 중점을 두는 개념입니다.

또한 함수형 프로그래밍과 관련된 많은 Java 퍼즐 및 연습이 포함되어 있습니다.

#5. 자바 클래스 라이브러리

Java 클래스 라이브러리는 Coursera에서 제공하는 핵심 Java 전문화의 일부입니다. Java Generics를 사용하여 형식이 안전한 코드를 작성하는 방법, 4000개 이상의 클래스로 구성된 클래스 라이브러리 이해, 파일 작업 방법 및 런타임 오류 처리 방법을 알려줍니다. 그러나 이 과정을 수강하기 위한 몇 가지 전제 조건이 있습니다.

  • 자바 소개
  • Java를 사용한 객체 지향 프로그래밍 소개
  • Java의 객체 지향 계층

마지막 말

Java Stream API와 Java 8의 Lambda 함수 도입은 병렬 반복, 기능적 인터페이스, 코드 감소 등과 같은 Java의 많은 부분을 간소화하고 개선했습니다.

그러나 스트림에는 몇 가지 제한 사항이 있습니다. 가장 큰 한계는 한 번만 사용할 수 있다는 것입니다. Java 개발자인 경우 위에서 언급한 리소스는 이러한 주제를 훨씬 더 자세히 이해하는 데 도움이 될 수 있으므로 반드시 확인하십시오.

Java의 예외 처리에 대해 알고 싶을 수도 있습니다.