JAVA

java 스트림 사용법 및 예제(최종 연산)

깨노비 2024. 1. 3. 01:22
728x90
반응형

Java Stream: Understanding the forEach Operation

Java 스트림에서 `forEach` 작업은 스트림의 각 요소에 대해 지정된 작업을 수행할 수 있는 터미널 작업입니다. 

일반적으로 스트림 요소를 수정하지 않고 처리하고 소비하는 데 사용됩니다.

How to Use the `forEach` Operation

'forEach' 작업을 사용하는 구문은 간단합니다. 

데이터 소스(예: 컬렉션 또는 배열)에서 스트림을 생성한 후 'forEach' 메서드를 사용하여 각 요소에 대해 수행할 작업을 지정할 수 있습니다.

List<String> fruits = Arrays.asList("apple", "banana", "orange", "kiwi");

// Using forEach to print each element in the stream
fruits.stream()
      .forEach(System.out::println);

이 예에서는 'forEach' 작업이 과일 스트림에 적용됩니다. 

`System.out::println` 메소드 참조는 스트림의 각 요소를 인쇄하는 데 사용되며, 이를 통해 요소가 발견될 때 이를 소비하고 처리할 수 있습니다.

 

예: 정수 목록의 요소 합산

정수 목록이 있고 `forEach`를 사용하여 요소의 합계를 계산하려는 실제 예를 고려해 보겠습니다.

import java.util.Arrays;
import java.util.List;

public class StreamForEachExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // Using forEach to calculate the sum of the elements
        int sum = 0;
        numbers.stream()
               .forEach(n -> sum += n);

        System.out.println("Sum of the elements: " + sum);
    }
}

이 예에서는 `forEach` 작업이 숫자 스트림에 적용됩니다. 

람다 표현식(`n -> sum += n`)은 요소의 합을 누적하는 데 사용됩니다. 

결과 `sum` 변수에는 목록에 있는 숫자의 합계가 포함됩니다.

.

결론

Java 스트림의 `forEach` 작업은 스트림 요소를 반복하고 처리하기 위한 강력한 도구입니다. 

인쇄, 계산 또는 기타 작업 수행 시 명시적인 반복 없이 요소를 소비하는 간결한 방법을 제공합니다. 

'forEach'를 이해하고 사용하면 Java에서 더욱 표현적이고 간결한 스트림 처리 코드를 작성하는 데 도움이 됩니다.

 

 

 

Java Stream: Understanding the toArray Operation

Java 스트림에서 `toArray` 작업은 스트림 요소를 배열로 변환할 수 있는 터미널 작업입니다. 

이는 스트림 요소의 배열 표현을 얻는 편리한 방법을 제공합니다.

How to Use the `toArray` Operation

'toArray' 작업을 사용하는 구문은 간단합니다. 

데이터 소스(예: 컬렉션 또는 배열)에서 스트림을 생성한 후 `toArray` 메서드를 사용하여 스트림 요소를 배열로 변환할 수 있습니다.

List<String> fruits = Arrays.asList("apple", "banana", "orange", "kiwi");

// Using toArray to convert the stream elements into an array
String[] fruitsArray = fruits.stream()
                            .toArray(String[]::new);

이 예에서는 'toArray' 작업이 과일 스트림에 적용됩니다.

메소드 참조 `String[]::new`는 결과 배열의 유형을 지정하는 데 사용됩니다.

`fruitsArray` 변수에는 스트림의 요소가 문자열 배열로 포함됩니다.

예: 정수를 배열로 변환

정수 목록이 있고 `toArray`를 사용하여 숫자 스트림을 배열로 변환하려는 실제 예를 고려해 보겠습니다.

import java.util.Arrays;
import java.util.List;

public class StreamToArrayExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // Using toArray to convert the stream of numbers into an array
        Integer[] numbersArray = numbers.stream()
                                       .toArray(Integer[]::new);

        System.out.println("Original List: " + numbers);
        System.out.println("Array of Numbers: " + Arrays.toString(numbersArray));
    }
}

이 예에서는 'toArray' 작업이 숫자 스트림에 적용됩니다. 

메소드 참조 `Integer[]::new`는 결과 배열의 유형을 지정하는 데 사용됩니다. 

`numbersArray` 변수에는 스트림의 요소가 정수 배열로 포함됩니다.

 

결론

Java 스트림의 `toArray` 작업은 스트림 요소의 배열 표현을 얻는 데 유용한 도구입니다. 

요소를 다양한 유형의 배열로 변환하는 유연성을 제공합니다. 

Java 스트림 처리에서 배열을 사용하여 작업해야 할 때 `toArray`를 이해하고 사용하는 것은 효율적이고 편리한 코드에 기여합니다.

 

 

 

Java Stream: Understanding the reduce Operation

Java 스트림에서 `reduce` 작업은 스트림 요소에 대한 축소를 수행할 수 있는 터미널 작업입니다. 

특정 방식으로 요소를 결합하여 단일 결과를 생성합니다. 

결과는 스트림 요소와 동일한 유형이거나 다른 유형일 수 있으므로 다양한 작업을 수행하는 데 유연성을 제공합니다.

How to Use the `reduce` Operation

'reduce' 작업을 사용하기 위한 구문에는 항등 요소(초기 값)와 이진 연산자 제공이 포함됩니다. 

이항 연산자는 요소가 결합되는 방식을 정의합니다. 

데이터 소스(예: 컬렉션 또는 배열)에서 스트림을 생성한 후 `reduce` 메서드를 사용하여 축소를 수행할 수 있습니다.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// Using reduce to calculate the sum of the elements
int sum = numbers.stream()
                 .reduce(0, (a, b) -> a + b);

이 예에서는 `reduce` 연산이 숫자 스트림에 적용됩니다. 

ID 요소 '0'은 합계의 초기 값이며 람다 식 '(a, b) -> a + b'는 요소가 결합되는 방식을 정의합니다. 

결과 `sum` 변수에는 목록에 있는 숫자의 합계가 포함됩니다.

 

예: 최대 요소 찾기

정수 목록이 있고 `reduce`를 사용하여 최대 요소를 찾으려는 실제 예를 고려해 보겠습니다.

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

public class StreamReduceExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(3, 8, 2, 5, 10);

        // Using reduce to find the maximum element
        Optional<Integer> maxElement = numbers.stream()
                                                 .reduce(Integer::max);

        maxElement.ifPresent(result -> System.out.println("Maximum Element: " + result));
    }
}

이 예에서는 `reduce` 연산이 숫자 스트림에 적용됩니다. 

`Integer::max` 메소드 참조는 최대 요소를 찾기 위한 이항 연산자로 사용됩니다. 

결과는 빈 스트림의 가능성을 처리하기 위해 `Optional`로 래핑됩니다.

 

결론

Java 스트림의 `reduce` 작업은 요소를 단일 결과로 집계하고 결합하는 강력한 도구입니다. 

이는 축소 논리 정의에 유연성을 제공하며 합산, 최대값 찾기, 문자열 연결 등을 포함한 다양한 작업에 사용할 수 있습니다. 

'reduce'를 이해하고 사용하면 Java에서 스트림 처리 코드의 표현력이 향상됩니다.

 

 

 

Java Stream: Understanding the collect Operation

Java 스트림에서 `collect` 작업은 스트림의 요소를 다른 형식(일반적으로 목록, 세트 또는 맵과 같은 컬렉션)으로 변환할 수 있는 터미널 작업입니다. 

이는 변경 가능한 결과 컨테이너에 요소를 축적하는 강력한 방법을 제공합니다.

How to Use the `collect` Operation

`collect` 작업을 사용하기 위한 구문에는 요소가 누적되는 방법을 정의하는 수집기를 지정하는 것이 포함됩니다. 

데이터 소스(예: 컬렉션 또는 배열)에서 스트림을 생성한 후 `collect` 메서드를 사용하여 변환을 수행할 수 있습니다.

List<String> fruits = Arrays.asList("apple", "banana", "orange", "kiwi");

// Using collect to transform the stream into a list
List<String> collectedFruits = fruits.stream()
                                      .collect(Collectors.toList());

이 예에서는 'collect' 작업이 과일 스트림에 적용됩니다. 

`Collectors.toList()` 콜렉터는 요소를 목록으로 변환하는 데 사용됩니다. 

결과 `collectedFruits` 변수에는 스트림의 요소가 문자열 목록으로 포함됩니다.

 

예: 길이별로 요소 그룹화

단어 목록이 있고 'collect'를 사용하여 길이에 따라 단어를 그룹화하려는 실제 예를 고려해 보겠습니다.

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class StreamCollectExample {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("apple", "banana", "orange", "kiwi", "grape");

        // Using collect to group words by length
        Map<Integer, List<String>> groupedByLength = words.stream()
                                      .collect(Collectors.groupingBy(String::length));

        System.out.println("Words grouped by length: " + groupedByLength);
    }
}

이 예에서는 'collect' 작업이 단어 스트림에 적용됩니다. 

`Collectors.groupingBy(String::length)` 컬렉터는 길이에 따라 단어를 그룹화하는 데 사용됩니다. 

결과 `groupedByLength` 맵에는 각 길이별로 그룹화된 단어 목록이 포함됩니다.

 

결론

Java 스트림의 '수집' 작업은 요소를 다른 형식으로 변환하고 축적하는 다목적 도구입니다. 

다양한 사용 사례에 대한 광범위한 수집기를 제공하므로 특정 요구 사항에 맞게 결과를 조정할 수 있습니다. 

'collect'를 이해하고 사용하면 Java에서 스트림 처리 코드의 유연성과 표현력이 향상됩니다.

 

 

 

Java Stream: Understanding the count Operation

Java 스트림에서 `count` 작업은 스트림의 요소 수를 계산할 수 있는 터미널 작업입니다. 이는 스트림의 크기나 카디널리티를 얻는 간단하고 효율적인 방법을 제공합니다.

How to Use the `count` Operation

'count' 작업을 사용하기 위한 구문에는 스트림에서 'count' 메서드를 호출하는 것이 포함됩니다. 데이터 소스(예: 컬렉션 또는 배열)에서 스트림을 생성한 후 'count' 메서드를 사용하여 스트림의 요소 수를 얻을 수 있습니다.

List<String> fruits = Arrays.asList("apple", "banana", "orange", "kiwi");

// Using count to get the number of elements in the stream
long numberOfFruits = fruits.stream()
                            .count();

이 예에서는 'count' 작업이 과일 스트림에 적용됩니다. 

결과 `numberOfFruits` 변수에는 스트림의 요소 개수, 즉 목록의 과일 개수가 포함됩니다.

 

예: 조건자를 기준으로 요소 계산

숫자 목록이 있고 'count'를 사용하여 목록에 있는 짝수의 개수를 찾는 실제 예를 생각해 보겠습니다.

import java.util.Arrays;
import java.util.List;

public class StreamCountExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // Using count to find the number of even numbers
        long numberOfEvens = numbers.stream()
                                    .filter(n -> n % 2 == 0)
                                    .count();

        System.out.println("Number of even numbers: " + numberOfEvens);
    }
}

이 예에서는 'filter' 연산을 사용하여 짝수를 필터링한 후 'count' 연산이 숫자 스트림에 적용됩니다. 

결과 `numberOfEvens` 변수에는 목록의 짝수 개수가 포함됩니다.

 

결론

Java 스트림의 'count' 연산은 스트림의 요소 수를 얻기 위한 간단하면서도 강력한 도구입니다. 

컬렉션의 크기나 카디널리티를 결정해야 할 때 특히 유용합니다. 

'count'를 이해하고 사용하면 Java에서 간결하고 효율적인 스트림 처리 코드를 작성하는 데 도움이 됩니다.

 

 

 

Java Stream: Understanding anyMatch, allMatch, and noneMatch Operations

Java 스트림에서 `anyMatch`, `allMatch` 및 `noneMatch` 작업은 스트림 요소 내에서 지정된 조건의 만족을 확인할 수 있는 터미널 작업입니다. 

이러한 작업은 지정된 기준을 충족하는 요소가 일부인지, 전부인지, 아니면 전혀 없는지를 평가하는 유연성을 제공합니다.

1. `anyMatch` Operation

`anyMatch` 작업은 스트림의 요소 중 하나 이상이 주어진 조건을 충족하는지 확인합니다. 

일치하는 요소를 찾으면 즉시 'true'를 반환합니다.

List<String> fruits = Arrays.asList("apple", "banana", "orange", "kiwi");

// Using anyMatch to check if any fruit starts with 'o'
boolean anyStartsWithO = fruits.stream()
                               .anyMatch(fruit -> fruit.startsWith("o"));

이 예에서는 문자 'o'로 시작하는 과일이 있는지 확인하기 위해 `anyMatch` 작업이 과일 스트림에 적용됩니다. 

"orange"가 조건을 만족하므로 결과 `anyStartsWithO` 변수는 `true`입니다.

 

2. `allMatch` Operation

`allMatch` 작업은 스트림의 모든 요소가 주어진 조건을 충족하는지 확인합니다. 

모든 요소가 지정된 기준과 일치하는 경우에만 'true'를 반환합니다.

List<Integer> numbers = Arrays.asList(2, 4, 6, 8, 10);

// Using allMatch to check if all numbers are even
boolean allAreEven = numbers.stream()
                            .allMatch(number -> number % 2 == 0);

이 예에서는 `allMatch` 연산이 숫자 스트림에 적용되어 모든 숫자가 짝수인지 확인합니다. 

결과 `allAreEven` 변수는 목록의 모든 숫자가 짝수이므로 `true`입니다.

 

3. `noneMatch` Operation

'noneMatch' 작업은 스트림의 요소 중 주어진 조건을 만족하는 요소가 없는지 확인합니다. 

지정된 기준과 일치하는 요소가 없으면 'true'를 반환합니다.

List<String> colors = Arrays.asList("red", "green", "blue", "yellow");

// Using noneMatch to check if no color contains the letter 'v'
boolean noneContainV = colors.stream()
                            .noneMatch(color -> color.contains("v"));

이 예에서는 'noneMatch' 작업이 색상 스트림에 적용되어 'v' 문자가 포함된 색상이 없는지 확인합니다. 

목록에 조건을 만족하는 색상이 없기 때문에 결과 `noneContainV` 변수는 `true`입니다.

 

결론

Java 스트림의 `anyMatch`, `allMatch` 및 `noneMatch` 작업은 스트림 요소 내의 조건 만족을 확인하는 편리한 방법을 제공합니다. 

이는 스트림의 내용에 대한 어설션을 만드는 데 유용한 도구이며 조건부 확인이 필요한 다양한 시나리오에서 일반적으로 사용됩니다.

 

 

 

Java Stream: Understanding findFirst and findAny Operations

Java 스트림에서 `findFirst` 및 `findAny` 작업은 특정 조건에 따라 스트림에서 요소를 검색할 수 있는 터미널 작업입니다. 

이러한 작업은 주어진 기준과 일치하는 첫 번째 요소나 스트림의 요소를 찾아야 할 때 특히 유용합니다.

1. `findFirst` Operation

'findFirst' 작업은 스트림의 첫 번째 요소가 포함된 'Optional'을 반환합니다. 스트림이 비어 있으면 빈 `Optional`을 반환합니다.

List<String> fruits = Arrays.asList("apple", "banana", "orange", "kiwi");

// Using findFirst to get the first fruit starting with 'a'
Optional<String> firstA = fruits.stream()
                                   .filter(fruit -> fruit.startsWith("a"))
                                   .findFirst();

// Checking if the Optional contains a value
if (firstA.isPresent()) {
    System.out.println("First fruit starting with 'a': " + firstA.get());
} else {
    System.out.println("No fruit starting with 'a' found.");
}

이 예에서는 문자 'a'로 시작하는 첫 번째 과일을 찾기 위해 `findFirst` 작업이 과일 스트림에 적용됩니다. 

결과 `Optional`(`firstA`)에는 일치하는 첫 번째 과일이 포함되거나 해당 과일이 없으면 비어 있습니다.

 

2. `findAny` Operation

'findAny' 작업은 스트림의 모든 요소가 포함된 'Optional'을 반환합니다. 

첫 번째 요소 반환이 보장되지 않으며 병렬 스트림에 더 적합합니다. 스트림이 비어 있으면 빈 `Optional`을 반환합니다.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// Using findAny to get any even number
Optional<Integer> anyEven = numbers.stream()
                                       .filter(number -> number % 2 == 0)
                                       .findAny();

// Checking if the Optional contains a value
if (anyEven.isPresent()) {
    System.out.println("Any even number: " + anyEven.get());
} else {
    System.out.println("No even number found.");
}

이 예에서는 `findAny` 작업이 숫자 스트림에 적용되어 임의의 짝수를 찾습니다. 

결과 `Optional`(`anyEven`)에는 일치하는 짝수가 포함되며, 해당 숫자가 없으면 비어 있습니다.

 

결론

Java 스트림의 `findFirst` 및 `findAny` 작업은 특정 조건에 따라 요소를 검색하는 데 유용합니다. 

이는 스트림에서 첫 번째 요소 또는 모든 요소를 얻는 데 유연성을 제공하며 특정 요소를 식별하거나 처리해야 하는 시나리오에서 일반적으로 사용됩니다.

 

 

 

Java Stream: Understanding min and max Operations

Java 스트림에서 `min` 및 `max` 작업은 각각 스트림의 최소 및 최대 요소를 찾을 수 있는 터미널 작업입니다. 

이러한 작업은 특정 기준에 따라 가장 작거나 가장 큰 요소를 결정해야 할 때 유용합니다.

1. `min` Operation

'min' 연산은 제공된 비교기에 따라 스트림의 최소 요소를 포함하는 'Optional'을 반환합니다.

List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 7);

// Using min to find the minimum number
Optional<Integer> minNumber = numbers.stream()
                                         .min(Integer::compareTo);

// Checking if the Optional contains a value
if (minNumber.isPresent()) {
    System.out.println("Minimum number: " + minNumber.get());
} else {
    System.out.println("No minimum number found.");
}

이 예에서는 'min' 연산이 숫자 스트림에 적용되어 최소 숫자를 찾습니다. 

결과 `Optional`(`minNumber`)에는 최소 숫자가 포함되거나 스트림이 비어 있는 경우 비어 있습니다.

 

2. `max` Operation

'max' 연산은 제공된 비교기에 따라 스트림의 최대 요소를 포함하는 'Optional'을 반환합니다.

List<Double> decimals = Arrays.asList(3.5, 1.2, 4.8, 2.1, 5.7);

// Using max to find the maximum decimal
Optional<Double> maxDecimal = decimals.stream()
                                           .max(Double::compareTo);

// Checking if the Optional contains a value
if (maxDecimal.isPresent()) {
    System.out.println("Maximum decimal: " + maxDecimal.get());
} else {
    System.out.println("No maximum decimal found.");
}

이 예에서는 'max' 연산을 소수점 이하 자릿수에 적용하여 최대 소수점을 찾습니다. 결과 `Optional`(`maxDecimal`)에는 최대 소수가 포함되거나 스트림이 비어 있으면 비어 있습니다.

 

결론

Java 스트림의 'min' 및 'max' 작업은 각각 스트림에서 가장 작은 요소와 가장 큰 요소를 찾는 데 유용합니다. 

이는 유연하며 비교기를 사용하여 주문 기준을 결정하는 사용자 정의가 가능합니다. 

이러한 작업은 극단값을 식별하는 것이 중요한 시나리오에서 일반적으로 사용됩니다.

 

 

 

Java Stream: Understanding forEachOrdered Operation

Java 스트림에서 `forEachOrdered` 작업은 정의된 순서에 따라 스트림 요소를 반복할 수 있는 터미널 작업입니다. 

병렬 스트림에서 특정 순서를 보장하지 않는 'forEach'와 달리 'forEachOrdered'는 요소가 스트림에 나타나는 순서대로 처리되도록 보장합니다.

Using `forEachOrdered` Operation

'forEachOrdered' 작업을 사용하기 위한 구문에는 스트림에서 메서드를 호출하고 각 요소에 대해 작업을 수행하는 소비자를 제공하는 작업이 포함됩니다.

List<String> fruits = Arrays.asList("apple", "banana", "orange", "kiwi");

// Using forEachOrdered to print each fruit in order
fruits.stream()
      .forEachOrdered(fruit -> System.out.println("Fruit: " + fruit));

이 예에서는 'forEachOrdered' 작업이 과일 스트림에 적용되고 각 과일을 순서대로 인쇄하는 소비자가 제공됩니다. 

요소는 원래 스트림의 순서를 유지하면서 순차적으로 처리됩니다.

 

병렬 스트림의 순서 보존

'forEachOrdered'는 순서 보존을 보장하지만 특히 병렬 스트림에 유용합니다. 

병렬 처리에서는 `forEach`를 사용하여 요소의 순서가 보장되지 않을 수 있습니다. 

그러나 `forEachOrdered`는 요소가 원래 스트림에 나타나는 순서대로 처리되도록 보장합니다.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// Using forEachOrdered in parallel stream to print numbers in order
numbers.parallelStream()
       .forEachOrdered(number -> System.out.println("Number: " + number));

이 병렬 스트림 예에서 `forEachOrdered` 작업은 병렬 처리에도 불구하고 숫자가 순서대로 인쇄되도록 보장합니다.

이는 순서 문제를 유지할 때 중요한 이점입니다.

결론

Java 스트림의 `forEachOrdered` 작업은 정의된 순서로 요소를 반복하는 안정적인 방법을 제공합니다. 

이는 병렬 스트림과 같이 처리 순서를 유지하는 것이 필수적인 시나리오나 순차 스트림에서 요소의 원래 순서가 중요한 경우에 특히 유용합니다.

728x90
반응형

'JAVA' 카테고리의 다른 글

java 스트림 사용법 및 예제(중간 연산)  (0) 2024.01.03
java 스트림이란? 사용법 및 예제  (1) 2024.01.03
java 연산자 정리  (0) 2024.01.01
java 변수 타입 정리  (1) 2024.01.01
JAVA 데이터 타입 정리  (0) 2024.01.01