본문 바로가기

programming/kotlin

[Error] stream has already been operated upon or closed

코틀린에 익숙해지기 위해서 코틀린을 이용해서 알고리즘 문제를 풀고 있는데 stream has already been operated upon or closed 에러를 만났다.

원인

닫힌 스트림을 재사용 시도했다.

class MinMax {
    fun solution(s: String): String {
        val numbers = s.split(" ").stream()
            .mapToInt { it.toInt() }

        val min = numbers.min()
        val max = numbers.max()

        return String.format("%d %d", min, max)
    }
}

위의 코드는 에러가 발생하는 코드인데 여기에서 문제점이 스트림을 재사용하려고 했다는 점이었다.
스트림(데이터 파이브라인)을 사용하고 데이터를 그대로 가지고 있는 컬랙션이 아니기 때문에 데이터는 사라진다. 그런데 위의 코드에서는 닫힌 스트림을 재사용을 하려니까 에러가 발생한 것이었다.

해결

스트림이 닫힌 이후에 사용한 것이 에러의 원인이기 때문에 스트림이 닫히기 전에 데이터를 추출하는 작업을 해주어야한다.
위의 코드에서는 동일한 스트림을 두번 사용해서 최소값과 최대값을 구하든가 아니면 스트림 처리를 한 후에 데이터를 리스트와 같은 자료 구조에 저장하고 조회하는 식으로 수정하면 될 것 같다.