Some people want them for other reasons, such as parallel processing. If that type is lazy, then you will lazily apply the change until you demand the collection in its entirety. In other words, most operators return you the same type as you started with, and if that type is "readonly" then you will receive a copy. By naming convention almost anything that starts with to is making a copy. Although for a Sequence, calling anything such as toList, toSet, toMap will result in the final copy being made. When used on a Sequence they modify the values as the collection as it is accessed and continue to be lazy (resulting in another Sequence). So to answer part of your questions, things like filter, map, flatmap, operators + - all create copies when used against non lazy collections. The Kotlin collections allow both copy-on-change mutations, as well as lazy mutations. But in cooperative Kotlin code that is fine, most uses do not need truly immutable collections and if your team avoids casts to the mutable form of the collection then maybe you don't need fully immutable collections. But the collection can be bypassed via casting or manipulated from Java. I think the only thing missing from the built-in Java 8 Collectors class is summarization.Īnother SO Post covers these equivalencies in detail is: What Java 8 Stream.As you see in other answers, Kotlin has readonly interfaces to mutable collections that let you view a collection through a readonly lens. Little 1-liners and no need to use the more complicated syntax of Java 8. There are functions in the stdlib for average, count, distinct,filtering, finding, grouping, joining, mapping, min, max, partitioning, slicing, sorting, summing, to/from arrays, to/from lists, to/from maps, union, co-iteration, all the functional paradigms, and more. It answers the title of the question "What is the Kotlin equivalent of Java llect?" For those you cannot find in Kotlin you can explore creating custom flows as described in the answer by This answer is added to help know what is capable within stdlib, so you can decide when to write something custom. NOTE: For some common cases where you would use llect from Java 8, you can use already existing stdlib functions in Kotlin.