ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바(JAVA)] 배열의 평균값, stream average()와 orElse(0)
    프로그래머스/자바(JAVA) 2023. 5. 26. 04:17
    728x90

     

    class Solution {
        public double solution(int[] numbers) {
            double answer = 0;
    
            int sum = 0;
            for(int i: numbers){
                sum+=i;
            }
            answer = sum/(double)numbers.length;
            return answer;
        }
    }

     


    // 다른풀이 stream()
    
    import java.util.Arrays;
    
    class Solution {
        public double solution(int[] numbers) {
            return Arrays.stream(numbers).average().orElse(0);
        }
    }

    📌stream()

    average() orElse(0) 스트림을 활용하여 평균 값을 계산하고 반환할 때 유용한 명령어이다.

     

    stream()은 데이터의 연속적인 흐름을 나타내는 기능이며 컬렉션(Collection)과 배열 등의 데이터 소스로부터 데이터를 받아들이고, 다양한 중간 연산과 최종 연산을 통해 데이터를 처리하는 기능을 제공한다.

     

     

     

    🔻 특징

    1. 데이터 소스: 스트림은 컬렉션, 배열, I/O 채널 등 다양한 데이터 소스로부터 데이터를 받아들일 수 있다.
    2. 연속적인 흐름: 스트림은 데이터를 순차적으로 한 번에 하나씩 처리합니다. 이는 데이터를 메모리에 모두 로드하지 않고 필요한 데이터만 처리할 수 있게 해준다.
    3. 중간 연산: 스트림은 중간 연산을 통해 데이터를 변환, 필터링, 정렬 등의 작업을 수행할 수 있습니다. 이러한 중간 연산은 지연(lazy) 연산이며, 최종 연산이 호출될 때에만 실제로 수행된다.
    4. 최종 연산: 스트림은 최종 연산을 통해 데이터를 처리하고 결과를 반환합니다. 최종 연산은 스트림 파이프라인을 종료시키는 역할을 수행하며, 스트림의 요소를 수집하거나 결과를 반환하는 역할을 할 수 있다.
    5. 내부 반복: 스트림은 내부적으로 반복을 처리하므로 개발자가 직접 반복 코드를 작성할 필요가 없다.

     

     

    💬 스트림을 사용하기 위해 다음과 같은 일련의 단계를 따를 수 있다.

    1. 스트림 생성: 데이터 소스로부터 스트림을 생성 후 Stream 인터페이스의 정적 메서드를 사용하거나, 컬렉션의 stream() 메서드를 호출하여 스트림을 생성할 수 있다.
    2. 중간 연산: 생성된 스트림에 대해 중간 연산을 적용한다. 이 단계에서 데이터를 변환, 필터링, 정렬 등의 작업을 수행할 수 있고, 중간 연산은 여러 개를 연결하여 체인 형태로 작성할 수 있다.
    3. 최종 연산: 최종 연산을 통해 스트림의 요소를 처리하고 결과를 반환한다. 이 단계에서 스트림의 파이프라인이 종료되며, 결과를 수집하거나 반환할 수 있다.

     

     

     

    ✅ 스트림(stream) 예시

    import java.util.Arrays;
    import java.util.List;
    
    public class StreamExample {
        public static void main(String[] args) {
            List<String> fruits = Arrays.asList("apple", "banana", "orange", "kiwi", "grape");
    
            fruits.stream()  // 스트림 생성
                    .filter(fruit -> fruit.length() > 5)  // 중간 연산: 길이가 5보다 큰 과일만 필터링
                    .map(String::toUpperCase)  // 중간 연산: 모든 과일을 대문자로 변환
                    .sorted()  // 중간 연산: 과일을 알파벳순으로 정렬
                    .forEach(System.out::println);  // 최종 연산: 결과 출력
        }
    }

     

    예시에서는 fruits 리스트스트림으로 변환하고, 중간 연산과 최종 연산을 사용하여 데이터를 처리하고 결과를 출력하고 있다.
    filter(), map(), sorted() 등의 중간 연산을 체인 형태로 연결하고, forEach()를 통해 최종 연산을 수행하여 각 과일을 대문자로 변환하고 알파벳순으로 정렬한 결과를 출력한다.
    스트림은 데이터 처리 작업을 간결하고 효율적으로 수행할 수 있는 강력한 기능으로, 함수형 프로그래밍 스타일의 코드를 작성할 수 있으며, 스트림은 병렬 처리 등 다양한 기능을 지원하므로 대량의 데이터를 처리할 때 효과적으로 사용할 수 있다.

     

     

     

     

    ❗ 자주 사용되는 몇 가지 스트림 연산

     

    1. 중간 연산 (Intermediate Operations):

    • filter(Predicate<T> predicate): 주어진 조건에 맞는 요소만을 선택합니다.
    • map(Function<T, R> mapper): 요소를 다른 형태로 변환합니다.
    • flatMap(Function<T, Stream<R>> mapper): 요소를 다른 형태의 스트림으로 변환한 후 펼쳐서 결합합니다.
    • sorted(): 요소를 정렬합니다.
    • distinct(): 중복 요소를 제거합니다.
    • limit(long maxSize): 요소의 개수를 제한합니다.
    • skip(long n): 처음 n개의 요소를 건너뜁니다.
    • peek(Consumer<T> action): 요소를 소비하면서 중간 결과를 확인합니다.

     

     

     

    2. 최종 연산 (Terminal Operations):

    • forEach(Consumer<T> action): 각 요소를 소비하여 작업을 수행합니다.
    • count(): 요소의 개수를 반환합니다.
    • collect(Collector<T, A, R> collector): 요소를 수집하여 컬렉션, 맵, 문자열 등의 형태로 반환합니다.
    • min(Comparator<T> comparator) / max(Comparator<T> comparator): 최소값 또는 최대값을 반환합니다.
    • anyMatch(Predicate<T> predicate): 주어진 조건을 만족하는 요소가 하나라도 있는지 확인합니다.
    • allMatch(Predicate<T> predicate): 모든 요소가 주어진 조건을 만족하는지 확인합니다.
    • noneMatch(Predicate<T> predicate): 모든 요소가 주어진 조건을 만족하지 않는지 확인합니다.
    • findFirst(): 첫 번째 요소를 반환합니다.
    • findAny(): 임의의 요소를 반환합니다.

     

     

     

     

     

     

    ✅ average() // orElse(0): 예제

    import java.util.stream.IntStream;
    
    public class StreamAverageExample {
        public static void main(String[] args) {
            IntStream numbers = IntStream.of(1, 2, 3, 4, 5);
            double average = numbers.average().orElse(0);
            System.out.println("Average: " + average);
        }
    }

     

     

    🔹 average():

    • average()는 스트림의 요소들의 평균 값을 계산하는 최종 연산이다.
    • double 타입의 OptionalDouble 객체반환한다.
    • 스트림이 비어있는 경우 OptionalDouble.empty()를 반환한다.
    • 예를 들어, IntStream에서 average()를 호출하면 평균 값을 계산하여 반환한다.
    • 위의 예시에서는 IntStream에 대한 평균 값을 계산하고 있습니다. average()를 호출한 후 orElse(0)을 사용하여 평균 값이 존재하지 않는 경우에는 0을 반환하도록 처리되었다.

     

     

    🔹 orElse(0):

    • orElse(0)는 Optional 객체가 비어있는 경우 대체 값을 반환하는 메서드이다.
    • Optional 객체가 비어있는 경우, 대체 값을 반환하며, 비어있지 않은 경우 Optional 객체의 값을 반환한다.
    • 위 예시 코드에서 average() 메서드의 결과는 OptionalDouble 객체이므로, orElse(0)를 호출하여 평균 값이 존재하지 않는 경우 0을 반환하도록 처리되었다.
    728x90
Designed by Tistory.