기능적 접근 방식을 취하는 경우 이것이 가장 효율적인 방법입니까?
@tailrec
def readLine(in: SomeTypeOfBuffer, a: Array[Byte]): Array[Byte] = {
val char = in.readByte()
char match{
case '\n' => a
case other => readLine(in, a :+ other)
}
}
각 재귀 호출은 새 배열을 만들기 때문에 다른 배열을위한 공간을 할당하기 위해 메모리에 대한 또 다른 호출이 이루어져야하며 이전 배열은 메모리에서 해제됩니다.
이것은 함수형 프로그래밍의 가격일까요?
(나는 스칼라에 비교적 익숙하지 않고 기능 적이기 때문에 끔찍하게 잘못된 것이 있다고해서 나를 못 박아주지 마십시오)
@DeFuncT가 말했듯이 빌드 할 때 데이터를 복사하지 않기 때문에 (불변) 목록 을 사용하는 것이 좋습니다 . 그 방법을 보여 드리겠습니다.
@QuickSilver의 조언도 적용 할 것입니다.
def readLine(in: SomeTypeOfBuffer): List[Byte] = {
val NewLine: Byte = '\n'.toByte
@annotation.tailrec
def loop(acc: List[Byte]): List[Byte]
in.readByte() match {
case NewLine => acc.reverse
case char => loop(other :: acc)
}
loop(acc = List.empty)
}
PS : 일반적인 Scala에서는 Array를 볼 수 없습니다 . 아마도 새로운 ArraySeq 또는 Vector .
일반 배열은 일반적으로 성능상의 이유로 만 사용되며 일반적으로 단일 메서드의 범위에 포함됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다