Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kotlin most efficient way sequence to set

Hi I've got list of 1330 objects and would like to apply method and obtain set as result.

        val result = listOf1330
            .asSequence()
            .map {
                someMethod(it)
            }
        val resultSet = result.toSet()

It works fine without toSet but if then execution time is about 10 times longer. I've used sequence to make it work faster and it is but as a result I need list without duplicates (set).

Simply: What is most effective way to convert sequence to set?

like image 785
MrNetroful Avatar asked Jan 19 '26 22:01

MrNetroful


2 Answers

 val result = listOf1330.mapTo(HashSet()) { someMethod(it) }

It makes less sense to use streams or sequences to implement the transformation - you will need all elements from the collection, not several. The mapTo (and map) functions are inline in Kotlin. It means the code will be substituted into the call site, it will not have lambda created and executed many times. We use mapTo to avoid the second copy of the collection done by the toSet() function.

The .parallelStream() may add more performance, if you like to run the computation in several threads. It is still a good idea to measure how good the load is balanced between threads. The performance may depend on the collection implementation class, on which you call it

like image 192
Eugene Petrenko Avatar answered Jan 22 '26 16:01

Eugene Petrenko


If your someObject has a slow implementation of equals() or hashCode(), or gives the same hash code for many objects, then that could account for the delay, and you may be able to improve it.

Otherwise, if the objects are big, the delay may be mostly due to the amount of memory that must be accessed to store them all; if so, that's the price you'll have to pay if you want a set with all those objects in memory.

Sequence.toSet() uses a LinkedHashSet.  You could try providing another Set instance, using e.g. toCollection(HashSet()), to see if that's any faster.  (You wouldn't get the same iteration order, though.)

like image 39
gidds Avatar answered Jan 22 '26 18:01

gidds