Skip to content

Instantly share code, notes, and snippets.

@wplong11
Last active December 6, 2021 02:19
Show Gist options
  • Select an option

  • Save wplong11/57f1dcdac96270bc919f39ebc8101988 to your computer and use it in GitHub Desktop.

Select an option

Save wplong11/57f1dcdac96270bc919f39ebc8101988 to your computer and use it in GitHub Desktop.

Revisions

  1. wplong11 revised this gist Dec 6, 2021. 1 changed file with 1 addition and 2 deletions.
    3 changes: 1 addition & 2 deletions AbstractSpliterator_Sequence.kt
    Original file line number Diff line number Diff line change
    @@ -30,9 +30,8 @@ fun test2() {
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    fun <T> InputStream.toObjectSequence(clazz: Class<T>): Sequence<T> {
    val inputStream: InputStream = this
    val mapper = ObjectMapper()
    val parser: JsonParser = mapper.createParser(inputStream.reader(Charsets.UTF_8))
    val parser: JsonParser = mapper.createParser(this.reader(Charsets.UTF_8))
    check(parser.nextToken() === JsonToken.START_ARRAY) { "Expected content to be an array" }
    return sequence {
    while (parser.nextToken() !== JsonToken.END_ARRAY) {
  2. wplong11 revised this gist Dec 6, 2021. 1 changed file with 3 additions and 5 deletions.
    8 changes: 3 additions & 5 deletions AbstractSpliterator_Sequence.kt
    Original file line number Diff line number Diff line change
    @@ -5,7 +5,7 @@ class JsonObjectSpliterator<T>(
    ) : Spliterators.AbstractSpliterator<T>(Long.MAX_VALUE, NONNULL or IMMUTABLE) {
    private val parser: JsonParser by lazy {
    mapper.createParser(inputStream.reader(Charsets.UTF_8)).also {
    check(!(it.nextToken() !== JsonToken.START_ARRAY)) { "Expected content to be an array" }
    check(it.nextToken() === JsonToken.START_ARRAY) { "Expected content to be an array" }
    }
    }

    @@ -32,10 +32,8 @@ fun test2() {
    fun <T> InputStream.toObjectSequence(clazz: Class<T>): Sequence<T> {
    val inputStream: InputStream = this
    val mapper = ObjectMapper()
    val parser: JsonParser = mapper.createParser(inputStream.reader(Charsets.UTF_8)).also {
    check(!(it.nextToken() !== JsonToken.START_ARRAY)) { "Expected content to be an array" }
    }

    val parser: JsonParser = mapper.createParser(inputStream.reader(Charsets.UTF_8))
    check(parser.nextToken() === JsonToken.START_ARRAY) { "Expected content to be an array" }
    return sequence {
    while (parser.nextToken() !== JsonToken.END_ARRAY) {
    yield(mapper.readValue(parser, clazz))
  3. wplong11 created this gist Dec 6, 2021.
    50 changes: 50 additions & 0 deletions AbstractSpliterator_Sequence.kt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,50 @@
    class JsonObjectSpliterator<T>(
    private val mapper: ObjectMapper,
    private val inputStream: InputStream,
    private val clazz: Class<T>
    ) : Spliterators.AbstractSpliterator<T>(Long.MAX_VALUE, NONNULL or IMMUTABLE) {
    private val parser: JsonParser by lazy {
    mapper.createParser(inputStream.reader(Charsets.UTF_8)).also {
    check(!(it.nextToken() !== JsonToken.START_ARRAY)) { "Expected content to be an array" }
    }
    }

    override fun tryAdvance(action: Consumer<in T>): Boolean {
    if (parser.nextToken() === JsonToken.END_ARRAY) return false

    action.accept(mapper.readValue(parser, clazz))
    return true
    }
    }

    fun <T> InputStream.toObjectStream(clazz: Class<T>): Stream<T> {
    return StreamSupport.stream(JsonObjectSpliterator(ObjectMapper(), this, clazz), false)
    }

    fun test2() {
    inputStream.toObjectStream(Product::class.java).forEach { product ->
    logger.debug { product }
    }
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    fun <T> InputStream.toObjectSequence(clazz: Class<T>): Sequence<T> {
    val inputStream: InputStream = this
    val mapper = ObjectMapper()
    val parser: JsonParser = mapper.createParser(inputStream.reader(Charsets.UTF_8)).also {
    check(!(it.nextToken() !== JsonToken.START_ARRAY)) { "Expected content to be an array" }
    }

    return sequence {
    while (parser.nextToken() !== JsonToken.END_ARRAY) {
    yield(mapper.readValue(parser, clazz))
    }
    }
    }

    fun test2() {
    inputStream.toObjectSequence(Product::class.java).forEach { product ->
    logger.debug { product }
    }
    }