[자바(JAVA)] 배열의 평균값 (stream average()와 orElse(0))

Noh Jihyeon·2023년 12월 14일
0
post-thumbnail

문제: https://school.programmers.co.kr/learn/courses/30/lessons/120817




✅ 내 풀이

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



2. 최종 연산 (Terminal Operations):

  • forEach(Consumer action): 각 요소를 소비하여 작업을 수행합니다.
  • count(): 요소의 개수를 반환합니다.
  • collect(Collector<T, A, R> collector): 요소를 수집하여 컬렉션, 맵, 문자열 등의 형태로 반환합니다.
  • min(Comparator comparator) / max(Comparator comparator): 최소값 또는 최대값을 반환합니다.
  • anyMatch(Predicate predicate): 주어진 조건을 만족하는 요소가 하나라도 있는지 확인합니다.
  • allMatch(Predicate predicate): 모든 요소가 주어진 조건을 만족하는지 확인합니다.
  • noneMatch(Predicate 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을 반환하도록 처리되었다.
profile
꼭꼭 씹어서 소화시키는 맛있는 코딩

0개의 댓글