Title
d

Daniele B

10/16/2020, 1:06 AM
``mylist.zip(mylist.drop(1)) { a, b -> myfunction(a,b) }``
is there a way to zip 3 lists instead of 2? something equivalent to this?
``zip(mylist, mylist.drop(1), mylist.drop(2)) { a, b, c -> myfunction(a,b,c) }``
I would like to create a new list of values, which are calculated based on the latest 3 values
r

Ruckus

10/16/2020, 1:49 AM
I think you want the
``windowed``
function
d

Daniele B

10/16/2020, 1:57 AM
ok, I get the meaning of windowed now:
``````mylist.windowed(2).map {
myfunction(it.get(0),it.get(1),it.get(2))
}``````
correct?
e

ephemient

10/16/2020, 2:04 AM
yes, though feel free to use the operator
``````mylist.windowed(2).map {
myFunction(it[0], it[1], it[2])
}``````
r

Ruckus

10/16/2020, 2:06 AM
Or destructure
``````mylist.windowed(2).map { (a, b, c) ->
myFunction(a, b, c)
}``````
d

Daniele B

10/16/2020, 2:08 AM
@ephemient thanks! @Ruckus actually in my case, I need something like this:
``````mylist.windowed(8).map {
myFunction(it[0], it[1], it[7])
}``````
because I need to calculate differences by the day and by the week, so I need to take the value 1 index later and 7 indexes later
on the documentation is written that
``windowed()``
is returning a list for each window: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/windowed.html I wonder if that ends up being too expensive, and whether it’s more efficient to just use an imperative loop
r

Ruckus

10/16/2020, 2:18 AM
An imperative loop would be more efficient, but whether it matters is a matter of testing.
☝️ 1
e

ephemient

10/16/2020, 2:20 AM
if
``mylist``
has random access then
``List(mylist.size - 8) { myFunction(mylist[it], mylist[it + 1], mylist[it + 7]) }``
would inline to the same as an imperative loop
❤️ 1
d

Daniele B

10/16/2020, 2:21 AM
what is
``random access``
actually?
e

ephemient

10/16/2020, 2:22 AM
r

Ruckus

10/16/2020, 2:23 AM
A list when
``list[n]``
is constant time, not linear
d

Daniele B

10/16/2020, 2:25 AM
I watched the Kotlin online event this week, and I heard Roman Elizarov saying to always prefer Lists to Arrays
I don’t even understand the difference to be honest
e

ephemient

10/16/2020, 2:26 AM
the distinction comes from java (there is no difference in representation on kotlin/js)
d

Daniele B

10/16/2020, 2:27 AM
I guess Roman was referring to the Kotlin/JVM
but I am doing multiplatform, so it would make a difference for me
e

ephemient

10/16/2020, 2:28 AM
Array comes from a time before generics, and as such has some unique and special treatment by the JVM, like built-in primitive types
List actually fits into the iterable/collection type hierarchy and works like everything else you'd expect
the default implementation is ArrayList which does use Array internally, but as a user all you care about is that it is amortized O(1) access
d

Daniele B

10/16/2020, 2:34 AM
so this would not work if I created my list with
``listOf``
?
``List(mylist.size - 8) { myFunction(mylist[it], mylist[it + 1], mylist[it + 7]) }``
e

ephemient

10/16/2020, 2:35 AM
it will work.
``listOf()``
is backed by an
``ArrayList``
(implementation detail, but even if it changes in the future it will still work)
d

Daniele B

10/16/2020, 2:36 AM
so would you say the above is more efficient than?
``````mylist.windowed(8).map {
myFunction(it[0], it[1], it[7])
}``````
e

ephemient

10/16/2020, 2:36 AM
yes, it doesn't need to be indirected through the window list view
👍 1
but it's almost certainly a smaller difference that you should care about
... and I realized it's slightly wrong; it should be
``List(mylist.size - 7)``
to get the last window. that's what happens easily when working without the abstractions
👍 1
v

Vampire

10/16/2020, 7:14 AM
Don't try to micro-optimize up front. 80% of the time your program is running is spent in 20% of the code (rough thumb rule). There is no real point in optimizing the other 80%. 1. Make your code working correctly 2. Make your code pretty (refactoring) 3. Optimize your code, but only where you actually have a performance problem according to testing or profiling
👍 2