Collection과 Sequence는 둘다 lambda의 확장함수( map, filter, find... )를 사용하여 원하는 결과를 찾아나갈 수 있습니다.

그런데 Collection의 확장함수를 사용하면, inline function을 통해서 매번 결과가 새롭게 만들어 집니다.

public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {
    return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)
}

하지만 Sequence는 inline function이 아닌 chain call 을 통해서 결과를 이어 나갈 수 있습니다.

public fun <T, R> Sequence<T>.map(transform: (T) -> R): Sequence<R> {
    return TransformingSequence(this, transform)
}

 

같은 결과이지만, 중간 과정에서 결과를 보면,

val items = mutableListOf(1, 2, 3, 4, 5)
val result = items.map {
    it * it
}.filter {
    it % 2 == 0
}

map에서 새로운 1,4,9,16,25 가 만들어진 뒤, filter에서 새로운 4, 16의 결과만 만들지게 됩니다.

 

하지만 sequence는,

val items = mutableListOf(1, 2, 3, 4, 5)
val result = items.asSequence().map {
    it * it
}.filter {
    it % 2 == 0
}.toList()

1,1,2,4,3,9,4,16,5,25 의 순서로, 새로운 결과를 만들어지는게 아니라, 하나씩 확인을 해갑니다.

 

 

Collection에서 새로운 결과를 계속 만들다 보면 memory사용도 많아지게 되지만, Sequence로 하게 되면, 메모리 문제는 Collection보다는 덜 하게 됩니다.

kotlin으로 파일을 읽는 방법은 java로 할 하는 경우보다는 간단?? 한듯 합니다.

최종적으로 android하면서 사용한 방법은

fun fileRead(context: Context, fileUri: Uri): String {
        val sb = StringBuilder()
        val inputStream = context.contentResolver.openInputStream(fileUri)
        inputStream?.let {
            val reader = BufferedReader(InputStreamReader(inputStream))
            val readLines = reader.readLines()
            readLines.forEach {
                sb.append(it)
            }
            
            it.close()
        }
        return sb.toString()
    }

이지만 아래와 같은 방법들이 있습니다.

1. forEachLine

fun fileReadforEachLine(file: String): String {

        val sb = StringBuilder()

        File(file).forEachLine {
            sb.append(it)
        }

        return sb.toString()
    }

2. useLines

fun fileReadUseLines(file: String): String {
        val sb = StringBuilder()

        File(file).useLines {
            it.forEach { str ->
                sb.append(str)
            }
        }

        return sb.toString()
    }

3. bufferedReader

fun fileReadBufferedReader(file: String): String {
        val sb = StringBuilder()

        File(file).bufferedReader().readLine().forEach {
            sb.append(it)
        }

        return sb.toString()
    }

4. readLines

fun fileReadReadLines(file: String): String {
        val sb = StringBuilder()

        File(file).readLines().forEach {
            sb.append(it)
        }

        return sb.toString()
    }

5. inputStream

fun fileReadInputStream(file: String): String {
        return File(file)
            .inputStream()
            .readBytes()
            .toString(Charsets.UTF_8)
    }

6. readText

fun fileReadReadText(file: String): String {
        return File(file).readText(Charsets.UTF_8)
    }

+ Recent posts