[Java] 스트림(Stream) 최댓값의 인덱스 찾기

서재·2023년 9월 26일

[Java] 스트림(Stream)

목록 보기
3/4

✅ 목표

List<Integer> 로부터 최댓값의 인덱스를 탐색


📕 without Stream

int maxValueIndex = 0;

int maxValue = arr.get(0);

int arrLength = arr.size();

for (int i=1; i<arrLength; i++) {
    int currentValue = arr.get(i);
    if (currentValue > maxValue) {
        maxValue = currentValue;
        maxValueIndex = i;
    }
}

📘 with Stream

AtomicInteger index = new AtomicInteger();

int maxValueIndex = arr.stream()
        .reduce(0, (maxValueIndex, currentValue) -> {
            int currentIndex = index.getAndIncrement();
            int maxValue = arr.get(maxValueIndex);
            if (currentValue > maxValue) {
                return currentIndex;
            }
            else {
                return maxValueIndex;
            }
        });

📌 .reduce(identity, () -> {})

전체를 합하거나 곱한 값을 찾아내는데 용이

객체의 각 요소들에 대해 람다 함수를 수행
람다식에서 return한 값이 다음 회차의 identity가 됨

📌 AtomicInteger

스트림은 내부에서 동적 변수를 사용할 수 없기에 AtomicInteger를 사용

원자적인 연산을 지원하는 정수형 변수 스레드 안전

.reduce의 람다식 내부에서도 사용할 수 있음

getAndIncrement() : i++
getAndDecrement() : i--
incrementAndGet() : ++i
decrementAndGet() : --i
get() : getter
set(int newValue): 값을 변경
compareAndSet(int expectValue, int newValue): 기대하는 값과 값이 다르다면 변경

profile
입니다.

0개의 댓글