{"id":357846,"date":"2024-05-20T23:59:17","date_gmt":"2024-05-20T23:59:17","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=357846"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-20T23:59:17","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=357846","title":{"rendered":"<span>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044f sequences \u2014 \u0438\u043b\u0438 \u043a\u0430\u043a \u043c\u043e\u0439 \u043a\u043e\u0434 \u043f\u043e\u043f\u0430\u043b \u0432 kotlin<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/536\/885\/da9\/536885da91fa38195a61b4b09f7cb10a.png\" width=\"2560\" height=\"760\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/536\/885\/da9\/536885da91fa38195a61b4b09f7cb10a.png\"\/><\/figure>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u044f \u043f\u0440\u043e\u0432\u0435\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0435\u043c\u0443 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 sequences. \u0422\u043e\u0447\u043d\u0435\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u043d\u043e \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043e\u043d\u043e \u0437\u0430\u043d\u044f\u043b\u043e 3-4 \u043c\u0435\u0441\u044f\u0446\u0430 \u043c\u043e\u0435\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u044f \u0438\u0437\u043c\u0435\u0440\u044f\u043b \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 sequences \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043b \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 sequences \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u043c\u043e\u0433\u043b\u0438 \u0431\u044b.<\/p>\n<blockquote>\n<p>\u042f \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 <strong>JetBrains<\/strong> \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u043c\u043e\u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0438\u0445 \u0432 kotlin 2.0 (<a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-58588\/Optimizations-for-sequence-functions-distinct-flatten\" rel=\"noopener noreferrer nofollow\"><u>Issue \u0432 kotlin \u0441 \u043c\u043e\u0438\u043c\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438<\/u><\/a><u>)<\/u><\/p>\n<\/blockquote>\n<p>\u042f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u0445 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 sequences \u0432 \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/768250\/\" rel=\"noopener noreferrer nofollow\">\u0418\u0437\u043c\u0435\u0440\u044f\u044f sequences<\/a>. <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0436\u0435, \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u0445 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435 \u043c\u043e\u0433\u0443\u0442 \u0443\u0441\u043a\u043e\u0440\u044f\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 15-20%. \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 kotlin \u0432 byte-code \u0438 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<h2>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f distinct<\/h2>\n<p>\u042f \u043e\u0431\u0440\u0430\u0442\u0438\u043b \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 distinct \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e filter. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f distinct \u0438\u043c\u0435\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0448 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c\u0438 -15%, \u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f filter \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u0443 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 3%-5% .<\/p>\n<h4>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439 filter<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"right\"><strong>\u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u043f\u0438\u0441\u043a\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"right\"><strong>Collection (ns)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"right\"><strong>Sequence (ns)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">100<\/p>\n<\/td>\n<td>\n<p align=\"right\">42 828<\/p>\n<\/td>\n<td>\n<p align=\"right\">43 557<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-2%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">1 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">488 092<\/p>\n<\/td>\n<td>\n<p align=\"right\">479 876<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>2%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">10 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">5 014 653<\/p>\n<\/td>\n<td>\n<p align=\"right\">4 862 738<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>3%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">50 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">25 080 389<\/p>\n<\/td>\n<td>\n<p align=\"right\">24 081 423<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>4%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">100 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">50 261 272<\/p>\n<\/td>\n<td>\n<p align=\"right\">48 016 813<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>4%<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f distinct<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"right\"><strong>\u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u043f\u0438\u0441\u043a\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"right\"><strong>Collection (ns)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"right\"><strong>Sequence (ns)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">100<\/p>\n<\/td>\n<td>\n<p align=\"right\">83 113<\/p>\n<\/td>\n<td>\n<p align=\"right\">100 762<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-21%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">1 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">1 005 813<\/p>\n<\/td>\n<td>\n<p align=\"right\">1 169 785<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-16%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">10 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">10 851 783<\/p>\n<\/td>\n<td>\n<p align=\"right\">12 856 475<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-18%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">50 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">60 652 896<\/p>\n<\/td>\n<td>\n<p align=\"right\">69 893 855<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-15%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">100 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">129 569 604<\/p>\n<\/td>\n<td>\n<p align=\"right\">146 594 000<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-13%<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u044d\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u0434 \u043e\u0431\u0435\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0437\u0430 \u0441\u0447\u0435\u0442 \u0447\u0435\u0433\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u0442\u0435\u0440\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 distinct.<\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f distinct<\/h3>\n<p>\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f distinct \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u0412\u043d\u0443\u0442\u0440\u0438 \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 HashSet <em><u>observed<\/u><\/em> \u0438 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442 \u0432 \u043d\u0435\u043c \u0432\u0441\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 <em><u>observed<\/u><\/em>, \u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043e\u043d \u0443\u0436\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f.<\/p>\n<pre><code class=\"kotlin\">private class DistinctIterator&lt;T, K>(     private val source: Iterator&lt;T>,      private val keySelector: (T) -> K ) : AbstractIterator&lt;T>() {     private val observed = HashSet&lt;K>()      override fun computeNext() {         while (source.hasNext()) {             val next = source.next()             val key = keySelector(next)              if (observed.add(key)) {                 setNext(next)                 return             }         }          done()     } }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043a\u043e\u0434\u0430 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439, \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u0434. \u041f\u043e \u0441\u0443\u0442\u0438, \u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435. \u0421\u043e\u0437\u0434\u0430\u0435\u0442 HashSet \u0438 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442 \u0432 \u043d\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.<\/p>\n<pre><code class=\"kotlin\">public inline fun &lt;T, K> Iterable&lt;T>.distinctBy(     selector: (T) -> K ): List&lt;T> {     val set = HashSet&lt;K>()     val list = ArrayList&lt;T>()     for (e in this) {         val key = selector(e)         if (set.add(key))             list.add(e)     }     return list } <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f sequences \u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u0432 \u0446\u0435\u043b\u043e\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442, \u0442\u043e \u043f\u043e\u0442\u0435\u0440\u0438 \u0433\u0434\u0435 \u0442\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 sequences, \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043a\u0430\u043a\u043e\u0439 \u0442\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <strong>AbstractIterator<\/strong>.<\/p>\n<pre><code class=\"kotlin\">private class DistinctIterator&lt;T, K>(     private val source: Iterator&lt;T>,      private val keySelector: (T) -> K ) : AbstractIterator&lt;T>() {    \/\/ .... }<\/code><\/pre>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u0432 \u043d\u0435\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 distinct \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0430. \u0418 \u0435\u0441\u043b\u0438 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0435, \u0442\u043e \u0438 \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u043f\u043e\u0442\u0435\u0440\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435.<\/p>\n<h4>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 AbstractIterator<\/h4>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <em><u>state<\/u><\/em> \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u043b\u0441\u044f \u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u043e\u043d \u0435\u0449\u0435 \u043d\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u043b\u0441\u044f, \u0442\u043e \u043e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <strong>tryToComputeNext()<\/strong>, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0443\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.<\/p>\n<pre><code class=\"kotlin\">private enum class State {     Ready,     NotReady,     Done,     Failed }  public abstract class AbstractIterator&lt;T> : Iterator&lt;T> {     private var state = State.NotReady     private var nextValue: T? = null      override fun hasNext(): Boolean {         require(state != State.Failed)         return when (state) {             State.Done -> false             State.Ready -> true             else -> tryToComputeNext()         }     }      override fun next(): T {         if (!hasNext()) throw NoSuchElementException()         state = State.NotReady         @Suppress(\"UNCHECKED_CAST\")         return nextValue as T     }      private fun tryToComputeNext(): Boolean {         state = State.Failed         computeNext()         return state == State.Ready     }      \/**      * Computes the next item in the iterator.      *      * This callback method should call one of these two methods:      *      * * [setNext] with the next value of the iteration      * * [done] to indicate there are no more elements      *      * Failure to call either method will result in the iteration terminating with a failed state      *\/     abstract protected fun computeNext(): Unit      \/**      * Sets the next value in the iteration, called from the [computeNext] function      *\/     protected fun setNext(value: T): Unit {         nextValue = value         state = State.Ready     }      \/**      * Sets the state to done so that the iteration terminates.      *\/     protected fun done() {         state = State.Done     } } <\/code><\/pre>\n<p>\u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043a\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043e\u0447\u0435\u043d\u044c \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u043e \u0438 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0437\u0434\u0435\u0441\u044c \u0431\u044b\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e. \u041d\u043e \u0433\u0434\u0435 \u0436\u0435 \u043e\u043d\u0438 \u0442\u043e\u0433\u0434\u0430?<\/p>\n<p>\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 sequences \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>fliter<\/strong> \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043e\u0434\u043d\u0430\u043a\u043e, \u043e\u043d \u043d\u0435 \u0434\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0448\u0430 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c\u0438. \u042f \u043d\u0430\u0447\u0430\u043b \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u0432\u0443\u0445 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f.<\/p>\n<h4>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 filter<\/h4>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436. \u0422\u0443\u0442 \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u043e\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043f\u043e\u043b\u0435 <em><u>nextState<\/u><\/em><\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <strong>calcNext()<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0435\u0439 \u043c\u0435\u0442\u043e\u0434\u0430 <strong>tryToComputeNext()<\/strong> \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 distinct<\/p>\n<pre><code class=\"kotlin\">internal class FilteringSequence&lt;T>(     private val sequence: Sequence&lt;T>,     private val sendWhen: Boolean = true,     private val predicate: (T) -> Boolean ) : Sequence&lt;T> {      override fun iterator(): Iterator&lt;T> = object : Iterator&lt;T> {         val iterator = sequence.iterator()         \/\/ -1 for unknown, 0 for done, 1 for continue         var nextState: Int = -1          var nextItem: T? = null          private fun calcNext() {             while (iterator.hasNext()) {                 val item = iterator.next()                 if (predicate(item) == sendWhen) {                     nextItem = item                     nextState = 1                     return                 }             }             nextState = 0         }          override fun next(): T {             if (nextState == -1)                 calcNext()             if (nextState == 0)                 throw NoSuchElementException()             val result = nextItem             nextItem = null             nextState = -1             @Suppress(\"UNCHECKED_CAST\")             return result as T         }          override fun hasNext(): Boolean {             if (nextState == -1)                 calcNext()             return nextState == 1         }     } } <\/code><\/pre>\n<p>\u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u0435\u043b\u043a\u0438\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u044d\u0442\u0438 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b. <\/p>\n<h4>\u0422\u0430\u043a \u0433\u0434\u0435 \u0436\u0435 \u043f\u043e\u0442\u0435\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 distinct?<\/h4>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430, \u0432 \u0441\u0438\u043b\u0443 \u0441\u0432\u043e\u0435\u0439 \u043d\u0435\u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0446\u0438\u0438, \u044f \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u043b \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438 \u0432\u044b\u0437\u043e\u0432\u044b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u041d\u043e \u043d\u0435\u0442, \u0435\u0441\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u0432 \u043e\u0434\u0438\u043d \u043e\u0431\u0449\u0438\u0439 \u043a\u043b\u0430\u0441\u0441, \u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0435\u043c \u0435\u0449\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u044d\u0442\u0438 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &#8212; \u044d\u0442\u043e <strong>Enum<\/strong>. <\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 <strong>filter<\/strong> \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 \u0432\u0438\u0434\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 <strong>Int<\/strong><\/p>\n<pre><code class=\"kotlin\">        \/\/ -1 for unknown, 0 for done, 1 for continue         var nextState: Int = -1 <\/code><\/pre>\n<p>\u0410 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 <strong>distinct<\/strong> \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 <strong>Enum<\/strong><\/p>\n<pre><code class=\"kotlin\">private enum class State {     Ready,     NotReady,     Done,     Failed }      private var state = State.NotReady<\/code><\/pre>\n<blockquote>\n<p>\u041d\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <strong>Enum<\/strong> \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u0430\u0432\u0430\u0442\u044c <strong>15%<\/strong> \u043f\u043e\u0442\u0435\u0440\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/blockquote>\n<p>\u041d\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0438\u0437 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u043e\u0434\u0430 \u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0432\u0438\u0434\u0435\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0438\u043b \u0441\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0438\u0436\u0435 \u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0430\u043d\u0430\u043b\u0438\u0437\u0443 byte-code \u043e\u0431\u0435\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c byte-code \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <em><u>nextState<\/u><\/em> \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>filter<\/strong>, \u0442\u043e \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u043c \u0442\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043b\u0438\u0448\u043d\u0435\u0433\u043e. \u041f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u0441\u0442\u0435\u043a, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u044b\u0437\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u043a\u043e\u0434\u0430.<\/p>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c byte-code \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <em><u>state<\/u><\/em> \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>distinct<\/strong>, \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043d\u0435\u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435.<\/p>\n<p><strong>\u042d\u0442\u043e \u043a\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0442\u0435\u0439\u0442\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 distinct<\/strong><\/p>\n<pre><code class=\"java\">        return when (state) {             State.Done -> false             State.Ready -> true             else -> tryToComputeNext()         }<\/code><\/pre>\n<p><strong>\u0410 \u044d\u0442\u043e byte-code, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0443\u0435\u0442<\/strong><\/p>\n<pre><code class=\"java\">#1  private final hasNext()Z #2   L0 #3    LINENUMBER 20 L0 #4    ALOAD 0 #5    GETFIELD AbstractIterator.state : Lcom\/AbstractIterator$State; #6    GETSTATIC AbstractIterator$WhenMappings.$EnumSwitchMapping$0 : [I #7    SWAP #8    INVOKEVIRTUAL AbstractIterator$State.ordinal ()I #9    IALOAD #10   L1 #11    TABLESWITCH #12      1: L2 #13      2: L3 #14      default: L4 #15   L2 <\/code><\/pre>\n<p>\u041d\u0435 \u0434\u0443\u043c\u0430\u044e \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0443\u043c\u0435\u044e\u0442 \u0447\u0438\u0442\u0430\u0442\u044c byte-code (<em>\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u044f \u043d\u0435 \u0443\u043c\u0435\u043b<\/em>), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e.<\/p>\n<p><strong>#5<\/strong> &#8212; \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <em><u>state<\/u><\/em><br \/><strong>#6<\/strong> &#8212; \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u043c\u0430\u0441\u0441\u0438\u0432 ordinal \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <strong>enum<\/strong> \u043a\u043b\u0430\u0441\u0441\u0430<br \/><strong>#7<\/strong> &#8212; \u043c\u0435\u043d\u044f\u0435\u0442 \u0434\u0432\u0435 \u044d\u0442\u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0435\u043a\u0435<br \/><strong>#8<\/strong> &#8212; \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 ordinal \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <em><u>state<\/u><\/em><br \/><strong>#9<\/strong> &#8212; <strong>IALOAD<\/strong> \u0438\u0449\u0435\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 ordinal \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 enum \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 ordinal \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <em><u>state<\/u><\/em><br \/><strong>#11<\/strong> &#8212; \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0445\u043e\u0434 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0443 TABLESWITCH \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e \u043d\u0443\u0436\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u0435 \u043a\u043e\u0434\u0430. <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <strong>when<\/strong> \u0432 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441 <strong>enum<\/strong>, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u043b\u0438\u0448\u043d\u044e\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u0441\u0435\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 enum \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a.<\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 ordinal \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0442\u043e \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0439 \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0439 \u0438 \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/p>\n<pre><code class=\"kotlin\">        return when (state.ordinal) {             State.Done.ordinal -> false             State.Ready.ordinal -> true             else -> tryToComputeNext()         }<\/code><\/pre>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438 \u0442\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f enum \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0438\u0441\u043a \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 ordinal \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 enum \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435. \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u043a\u043e\u0434\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f enum \u043a\u043b\u0430\u0441\u0441\u0430. \u041a\u0430\u0436\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 android \u044d\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\n<p>\u0427\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435, \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044f \u0434\u043e\u043a\u043e\u043f\u0430\u043b\u0441\u044f \u0434\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u044f \u043d\u0430\u0448\u0435\u043b \u0441\u0442\u0430\u0440\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e Jake Wharton, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443<\/p>\n<blockquote>\n<p><a href=\"https:\/\/jakewharton.com\/r8-optimization-enum-switch-maps\/\" rel=\"noopener noreferrer nofollow\">Jake Wharton &#8212; R8 Optimization: Enum Switch Maps, 2019<\/a><\/p>\n<\/blockquote>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u043d \u043e\u0431\u0435\u0449\u0430\u043b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u0435\u0449\u0435 \u0432 2019 \u0433\u043e\u0434\u0443, \u043d\u043e \u0432\u0438\u0434\u0438\u043c\u043e \u043d\u0435 \u0443\u0441\u043f\u0435\u043b.<\/p>\n<h3>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 distinct<\/h3>\n<p>\u042f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e distinct \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043d\u044e\u0430\u043d\u0441\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 enum. \u042f \u0443\u0431\u0440\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 enum \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0435 Int \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b.<\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u044d\u0442\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 <strong>10%-15%<\/strong>, \u0447\u0442\u043e \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e<\/p>\n<h4>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0437\u0430\u043c\u0435\u0440\u043e\u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 distinct<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"149\" width=\"149\">\n<p align=\"right\"><strong>\u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u043f\u0438\u0441\u043a\u0430<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"141\" width=\"141\">\n<p align=\"right\"><strong>Collection (ns)<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"146\" width=\"146\">\n<p align=\"right\"><strong>Original Sequence (ns)<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"right\"><strong>Optimized Sequence (ns)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"149\" width=\"149\">\n<p align=\"right\">100<\/p>\n<\/td>\n<td data-colwidth=\"141\" width=\"141\">\n<p align=\"right\">83 113<\/p>\n<\/td>\n<td data-colwidth=\"146\" width=\"146\">\n<p align=\"right\">100 762<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"right\">80 538<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>18%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"149\" width=\"149\">\n<p align=\"right\">1 000<\/p>\n<\/td>\n<td data-colwidth=\"141\" width=\"141\">\n<p align=\"right\">1 005 813<\/p>\n<\/td>\n<td data-colwidth=\"146\" width=\"146\">\n<p align=\"right\">1 169 785<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"right\">984 303<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>16%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"149\" width=\"149\">\n<p align=\"right\">10 000<\/p>\n<\/td>\n<td data-colwidth=\"141\" width=\"141\">\n<p align=\"right\">10 851 783<\/p>\n<\/td>\n<td data-colwidth=\"146\" width=\"146\">\n<p align=\"right\">12 856 475<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"right\">11 111 379<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>17%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"149\" width=\"149\">\n<p align=\"right\">50 000<\/p>\n<\/td>\n<td data-colwidth=\"141\" width=\"141\">\n<p align=\"right\">60 652 896<\/p>\n<\/td>\n<td data-colwidth=\"146\" width=\"146\">\n<p align=\"right\">69 893 855<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"right\">61 164 896<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>14%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"149\" width=\"149\">\n<p align=\"right\">100 000<\/p>\n<\/td>\n<td data-colwidth=\"141\" width=\"141\">\n<p align=\"right\">129 569 604<\/p>\n<\/td>\n<td data-colwidth=\"146\" width=\"146\">\n<p align=\"right\">146 594 000<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"right\">129 624 667<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>12%<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u0446\u0438\u0438 distinct<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">private class OptimizedDistinctIterator&lt;T, K>(     private val source: Iterator&lt;T>,      private val keySelector: (T) -> K ) : Iterator&lt;T>{     private val observed = HashSet&lt;K>()     \/\/ { UNDEFINED_STATE, HAS_NEXT_ITEM, HAS_FINISHED }     private var nextState: Int = UNDEFINED_STATE     private var nextItem: T? = null      override fun hasNext(): Boolean {         if (nextState == UNDEFINED_STATE)             calcNext()         return nextState == HAS_NEXT_ITEM     }      override fun next(): T {         if (nextState == UNDEFINED_STATE)             calcNext()         if (nextState == HAS_FINISHED)             throw NoSuchElementException()         nextState = UNDEFINED_STATE         return nextItem as T     }      private fun calcNext() {         while (source.hasNext()) {             val next = source.next()             val key = keySelector(next)              if (observed.add(key)) {                 nextItem = next                 nextState = HAS_NEXT_ITEM \/\/ found next item                 return             }         }         nextState = HAS_FINISHED \/\/ end of iterator     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f flatten<\/h2>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b \u0441\u0432\u043e\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u0442\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f flatten \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c \u043f\u043e\u0447\u0442\u0438 <strong>\u0432 2 \u0440\u0430\u0437\u0430<\/strong>. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0432 \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a. \u042d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<h4>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439 flatten<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"right\"><strong>\u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u043f\u0438\u0441\u043a\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"right\"><strong>Collection (ns)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"right\"><strong>Sequence (ns)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">100<\/p>\n<\/td>\n<td>\n<p align=\"right\">147 451<\/p>\n<\/td>\n<td>\n<p align=\"right\">414 376<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-181%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">1 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">1 512 504<\/p>\n<\/td>\n<td>\n<p align=\"right\">4 167 416<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-176%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">10 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">15 345 992<\/p>\n<\/td>\n<td>\n<p align=\"right\">41 305 365<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-169%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">50 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">75 917 917<\/p>\n<\/td>\n<td>\n<p align=\"right\">205 262 897<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-170%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">100 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">142 455 042<\/p>\n<\/td>\n<td>\n<p align=\"right\">401 473 313<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-182%<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<blockquote>\n<p>\u041f\u0440\u043e\u0438\u0433\u0440\u044b\u0448 \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430, \u044d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e. <\/p>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043a\u0440\u0435\u0441\u0442 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 sequences \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439, \u0435\u0441\u043b\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 <strong>flatten<\/strong><\/p>\n<\/blockquote>\n<p>\u0427\u0442\u043e \u0435\u0449\u0435 \u043e\u0431\u0438\u0434\u043d\u0435\u0439, <strong>flatten<\/strong> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0432 sequences \u0438 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0442\u0430\u043a\u0436\u0435 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <strong>plus<\/strong><\/p>\n<pre><code class=\"kotlin\">public operator fun &lt;T> Sequence&lt;T>.plus(elements: Iterable&lt;T>): Sequence&lt;T> {     return sequenceOf(this, elements.asSequence()).flatten() }<\/code><\/pre>\n<p>\u041c\u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0443\u0441\u043f\u0435\u0445\u043e\u043c \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 distinct, \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 flatten<\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f flatten<\/h3>\n<p>\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f flatten \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u0435\u043d \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u0412 \u0446\u0435\u043b\u043e\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439:<\/p>\n<p>\u041d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 <strong>hasNext()<\/strong>, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <strong>ensureItemIterator()<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435 <em><u>itemIterator<\/u><\/em>.<\/p>\n<p>\u041f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <strong>next()<\/strong> \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <em><u>itemIterator.next()<\/u><\/em> \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.<\/p>\n<pre><code class=\"kotlin\">internal class FlatteningSequence&lt;T, R, E> constructor(     private val sequence: Sequence&lt;T>,     private val transformer: (T) -> R,     private val iterator: (R) -> Iterator&lt;E> ) : Sequence&lt;E> {        override fun iterator(): Iterator&lt;E> = object : Iterator&lt;E> {         val iterator = sequence.iterator()         var itemIterator: Iterator&lt;E>? = null          override fun next(): E {             if (!ensureItemIterator())                 throw NoSuchElementException()             return itemIterator!!.next()         }          override fun hasNext(): Boolean {             return ensureItemIterator()         }          private fun ensureItemIterator(): Boolean {             if (itemIterator?.hasNext() == false)                 itemIterator = null              while (itemIterator == null) {                 if (!iterator.hasNext()) {                     return false                 } else {                     val element = iterator.next()                     val nextItemIterator = iterator(transformer(element))                     if (nextItemIterator.hasNext()) {                         itemIterator = nextItemIterator                         return true                     }                 }             }             return true         }     } } <\/code><\/pre>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c\u0441\u044f, \u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0448\u044c, \u0447\u0442\u043e \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0438 \u0437\u0430\u0446\u0435\u043f\u0438\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u0437\u0430 \u0447\u0442\u043e.<\/p>\n<p>\u041d\u043e \u043f\u043e\u0442\u043e\u043c \u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043b \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 <em><u>itemIterator<\/u><\/em> \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043e \u043a\u0430\u043a nullable \u0442\u0438\u043f<\/p>\n<pre><code class=\"kotlin\">    override fun iterator(): Iterator&lt;E> = object : Iterator&lt;E> {         val iterator = sequence.iterator()         var itemIterator: Iterator&lt;E>? = null<\/code><\/pre>\n<p>\u0410 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044e, kotlin \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u043d\u0435 Null. \u0410 \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f.<\/p>\n<p>\u042f \u043f\u043e\u043c\u0435\u0442\u0438\u043b \u0432 \u043a\u043e\u0434\u0435 \u0437\u0432\u0435\u0437\u0434\u043e\u0447\u043a\u0430\u043c\u0438 \u0432\u0441\u0435 \u0442\u0430\u043a\u0438\u0435 \u043c\u0435\u0441\u0442\u0430, \u0433\u0434\u0435 \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u043b\u0438\u0448\u043d\u044e\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 Null \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. <\/p>\n<pre><code class=\"kotlin\">        override fun next(): E {             if (!ensureItemIterator())                 throw NoSuchElementException() **          return itemIterator!!.next()         }          private fun ensureItemIterator(): Boolean { **          if (itemIterator?.hasNext() == false)                 itemIterator = null <\/code><\/pre>\n<p>\u042f \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u043b \u044d\u0442\u043e\u0442 \u043d\u0435\u0434\u043e\u0447\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430 <strong>EmptyIterator<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0443 <em><u>ItemIterator<\/u><\/em> \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 Null \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"kotlin\">\/\/ Empty iterator for cause when we haven't next element private object EmptyIterator: Iterator&lt;Nothing> {     override fun hasNext(): Boolean = false     override fun next(): Nothing = throw NoSuchElementException() }<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u043c\u043d\u0435 \u0443\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 Null \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043f\u043e\u043b\u044e <em><u>itemIterator<\/u><\/em><\/p>\n<pre><code class=\"kotlin\">    override fun iterator(): Iterator&lt;E> = object : Iterator&lt;E> {         val iterator = sequence.iterator()         var itemIterator: Iterator&lt;E> = EmptyIterator          override fun next(): E {             if (!ensureItemIterator())                 throw NoSuchElementException()           return itemIterator.next() \/\/ \u0431\u044b\u043b\u043e itemIterator!!.next()         }          private fun ensureItemIterator(): Boolean {           if (itemIterator.hasNext() == false) \/\/ \u0431\u044b\u043b\u043e itemIterator?.hasNext()                 itemIterator = null       <\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043b \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 <strong>next()<\/strong> \u0438 <strong>hasNext()<\/strong> \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <strong>ensureItemIterator()<\/strong><\/p>\n<pre><code class=\"kotlin\">        override fun next(): E {             if (!ensureItemIterator())                 throw NoSuchElementException()             return itemIterator!!.next()         }          override fun hasNext(): Boolean {             return ensureItemIterator()         }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0441 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043f\u0430\u0440\u043e\u0439 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <strong>hasNext()<\/strong> + <strong>next()<\/strong>, \u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0442\u043e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <strong>ensureItemIterator() <\/strong>\u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u0415\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u043e\u043b\u0435, \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u042f \u0432\u0432\u0435\u043b \u043f\u043e\u043b\u0435 <em><u>state<\/u><\/em> \u0438 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e \u0435\u0433\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 <strong>ensureItemIterator()<\/strong>, \u0430 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <strong>next()<\/strong>, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <strong>ensureItemIterator()<\/strong> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043d\u0430 \u043f\u0430\u0440\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 <strong>hasNext()<\/strong> + <strong>next()<\/strong><\/p>\n<p>\u0412\u0441\u0435 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u043c\u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>flatten<\/strong>.<\/p>\n<h3>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 flatten<\/h3>\n<p>\u041e\u0442\u043a\u0430\u0437 \u043e\u0442 nullable \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f <em><u>ensureItemIterator<\/u><\/em> \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. <strong>\u0412\u044b\u0438\u0433\u0440\u044b\u0448 35%-37%<\/strong>, \u0447\u0442\u043e \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<h4>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0437\u0430\u043c\u0435\u0440\u043e\u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 flatten<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"143\" width=\"143\">\n<p align=\"right\"><strong>\u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u043f\u0438\u0441\u043a\u0430<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"146\" width=\"146\">\n<p align=\"right\"><strong>Collection (ns)<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"145\" width=\"145\">\n<p align=\"right\"><strong>Original Sequence (ns)<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"148\" width=\"148\">\n<p align=\"right\"><strong>Optimized Sequence (ns)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"143\" width=\"143\">\n<p align=\"right\">100<\/p>\n<\/td>\n<td data-colwidth=\"146\" width=\"146\">\n<p align=\"right\">147 451<\/p>\n<\/td>\n<td data-colwidth=\"145\" width=\"145\">\n<p align=\"right\">414 376<\/p>\n<\/td>\n<td data-colwidth=\"148\" width=\"148\">\n<p align=\"right\">348 026<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>42%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"143\" width=\"143\">\n<p align=\"right\">1 000<\/p>\n<\/td>\n<td data-colwidth=\"146\" width=\"146\">\n<p align=\"right\">1 512 504<\/p>\n<\/td>\n<td data-colwidth=\"145\" width=\"145\">\n<p align=\"right\">4 167 416<\/p>\n<\/td>\n<td data-colwidth=\"148\" width=\"148\">\n<p align=\"right\">3 568 417<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>38%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"143\" width=\"143\">\n<p align=\"right\">10 000<\/p>\n<\/td>\n<td data-colwidth=\"146\" width=\"146\">\n<p align=\"right\">15 345 992<\/p>\n<\/td>\n<td data-colwidth=\"145\" width=\"145\">\n<p align=\"right\">41 305 365<\/p>\n<\/td>\n<td data-colwidth=\"148\" width=\"148\">\n<p align=\"right\">35 307 083<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>37%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"143\" width=\"143\">\n<p align=\"right\">50 000<\/p>\n<\/td>\n<td data-colwidth=\"146\" width=\"146\">\n<p align=\"right\">75 917 917<\/p>\n<\/td>\n<td data-colwidth=\"145\" width=\"145\">\n<p align=\"right\">205 262 897<\/p>\n<\/td>\n<td data-colwidth=\"148\" width=\"148\">\n<p align=\"right\">175 828 229<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>36%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"143\" width=\"143\">\n<p align=\"right\">100 000<\/p>\n<\/td>\n<td data-colwidth=\"146\" width=\"146\">\n<p align=\"right\">142 455 042<\/p>\n<\/td>\n<td data-colwidth=\"145\" width=\"145\">\n<p align=\"right\">401 473 313<\/p>\n<\/td>\n<td data-colwidth=\"148\" width=\"148\">\n<p align=\"right\">369 176 459<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>36%<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 flatten<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/\/ Empty iterator for cause when we haven't next element private object EmptyIterator: Iterator&lt;Nothing> {     override fun hasNext(): Boolean = false     override fun next(): Nothing = throw NoSuchElementException() }  internal class FlatteningSequence&lt;T, R, E> constructor(     private val sequence: Sequence&lt;T>,     private val transformer: (T) -> R,     private val iterator: (R) -> Iterator&lt;E> ) : Sequence&lt;E> {      override fun iterator(): Iterator&lt;E> = object : Iterator&lt;E> {         private val iterator = sequence.iterator()         private var itemIterator: Iterator&lt;E> = EmptyIterator                   \/\/ { UNDEFINED_STATE, HAS_NEXT_ITEM, HAS_FINISHED }         private var state: Int = UNDEFINED_STATE           override fun next(): E {             if (state == UNDEFINED_STATE) {                  ensureItemIterator()             }             state = UNDEFINED_STATE             return itemIterator.next()         }          override fun hasNext(): Boolean {             return when (state) {                  HAS_NEXT_ITEM -> true                 HAS_FINISHED -> false                 else -> ensureItemIterator()             }         }          private fun ensureItemIterator(): Boolean {             if (itemIterator.hasNext()) {                 state = HAS_NEXT_ITEM                 return true             } else {                 while (iterator.hasNext()) {                     val nextItemIterator = iterator(transformer(iterator.next()))                     if (nextItemIterator.hasNext()) {                         itemIterator = nextItemIterator                         state = HAS_NEXT_ITEM                         return true                     }                 }                 state = HAS_FINISHED                 itemIterator = EmptyIterator                 return false             }         }     } }  <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u0432 JetBrains<\/h2>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0431\u043e\u044f\u043b\u0441\u044f, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043c\u043e\u0438\u0445 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043f\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 sequences \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0438 \u043c\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c. \u0412\u0441\u0435 \u0442\u0430\u043a\u0438 JetBrains &#8212; \u044d\u0442\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0438 \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u043e\u0438\u043c\u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u041d\u043e \u0432\u0441\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c \u044f \u0434\u0443\u043c\u0430\u043b.<\/p>\n<p>\u0412 JetBrains \u0435\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439<a href=\"https:\/\/youtrack.jetbrains.com\/issues\" rel=\"noopener noreferrer nofollow\"> <u>youtrack<\/u><\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u044e Issue \u0438 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438\u043b\u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e \u043c\u043e\u044f<a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-58588\/Optimizations-for-sequence-functions-distinct-flatten\" rel=\"noopener noreferrer nofollow\"> <u>issue<\/u><\/a> \u0441 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0438\u0441\u0435\u043b\u0430 \u0431\u0435\u0437 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f. \u0415\u0435 \u043f\u043e\u0447\u0442\u0438 \u0441\u0440\u0430\u0437\u0443 \u0440\u0430\u0437\u043c\u0435\u0442\u0438\u043b\u0438 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u0442\u0435\u0433\u0430\u043c\u0438 \u0438 \u043e\u0442\u043d\u0435\u0441\u043b\u0438 \u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c kotlin. \u0410 \u0437\u0430\u0442\u0435\u043c, \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0435\u0441\u044f\u0446\u0435\u0432, \u043f\u043e \u043d\u0435\u0439 \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>\u041d\u043e \u0441\u043f\u0443\u0441\u0442\u044f 3 \u0438\u043b\u0438 4 \u043c\u0435\u0441\u044f\u0446\u0430, \u0434\u043e \u043d\u0435\u0435 \u0432\u0441\u0435 \u0442\u0430\u043a\u0438 \u0434\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0434\u0435\u043b\u044e \u043e\u043d\u0430 \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u0432\u043b\u0438\u0442\u0430 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0442\u043a\u0443 kotlin 2.0.<\/p>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u0447\u0430\u0441\u0442\u0438\u0447\u043a\u0430 \u043c\u0435\u043d\u044f, \u043c\u043e\u0438 \u0438\u0434\u0435\u0438, \u0435\u0441\u0442\u044c \u0432 kotlin. \u0418 \u043e\u0442 \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u043d\u044f &#171;<em>\u043f\u0440\u0435\u0442<\/em>&#187; \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440.<\/p>\n<blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0442\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438\u043b\u0438 \u0432\u0438\u0434\u0438\u0448\u044c \u043a\u0430\u043a\u043e\u0435 \u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0442\u043e \u043d\u0435 \u043d\u0430\u0434\u043e \u0431\u043e\u044f\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c Issue \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b. <\/p>\n<p>\u042d\u0442\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0434\u0435\u043b\u0430\u044e\u0442 \u0442\u0430\u043a\u0438\u0435 \u0436\u0435 \u043b\u044e\u0434\u0438 \u043a\u0430\u043a \u0442\u044b \u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0435\u0431\u0435 \u043f\u0440\u0438\u0448\u043b\u0430 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u0434\u0435\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u043b\u0443\u0447\u0448\u0435.<\/p>\n<\/blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u043c\u043e\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u043f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u0443\u0439\u0442\u0435 \u0437\u0430 \u043c\u043e\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0430 medium <a href=\"https:\/\/medium.comt\/measuring-sequences-6536db14d576\" rel=\"noopener noreferrer nofollow\">&#171;Measuring sequences&#187;<\/a>. \u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0435\u0435 \u043d\u0430 \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0435.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/768306\/\"> https:\/\/habr.com\/ru\/articles\/768306\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u044f \u043f\u0440\u043e\u0432\u0435\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0435\u043c\u0443 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 sequences. \u0422\u043e\u0447\u043d\u0435\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u043d\u043e \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043e\u043d\u043e \u0437\u0430\u043d\u044f\u043b\u043e 3-4 \u043c\u0435\u0441\u044f\u0446\u0430 \u043c\u043e\u0435\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u044f \u0438\u0437\u043c\u0435\u0440\u044f\u043b \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 sequences \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043b \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 sequences \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u043c\u043e\u0433\u043b\u0438 \u0431\u044b.<\/p>\n<blockquote>\n<p>\u042f \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 <strong>JetBrains<\/strong> \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u043c\u043e\u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0438\u0445 \u0432 kotlin 2.0 (<a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-58588\/Optimizations-for-sequence-functions-distinct-flatten\" rel=\"noopener noreferrer nofollow\"><u>Issue \u0432 kotlin \u0441 \u043c\u043e\u0438\u043c\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438<\/u><\/a><u>)<\/u><\/p>\n<\/blockquote>\n<p>\u042f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u0445 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 sequences \u0432 \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/768250\/\" rel=\"noopener noreferrer nofollow\">\u0418\u0437\u043c\u0435\u0440\u044f\u044f sequences<\/a>. <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0436\u0435, \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u0445 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435 \u043c\u043e\u0433\u0443\u0442 \u0443\u0441\u043a\u043e\u0440\u044f\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 15-20%. \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 kotlin \u0432 byte-code \u0438 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<h2>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f distinct<\/h2>\n<p>\u042f \u043e\u0431\u0440\u0430\u0442\u0438\u043b \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 distinct \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e filter. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f distinct \u0438\u043c\u0435\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0448 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c\u0438 -15%, \u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f filter \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u0443 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 3%-5% .<\/p>\n<h4>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439 filter<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"right\"><strong>\u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u043f\u0438\u0441\u043a\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"right\"><strong>Collection (ns)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"right\"><strong>Sequence (ns)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">100<\/p>\n<\/td>\n<td>\n<p align=\"right\">42 828<\/p>\n<\/td>\n<td>\n<p align=\"right\">43 557<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-2%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">1 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">488 092<\/p>\n<\/td>\n<td>\n<p align=\"right\">479 876<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>2%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">10 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">5 014 653<\/p>\n<\/td>\n<td>\n<p align=\"right\">4 862 738<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>3%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">50 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">25 080 389<\/p>\n<\/td>\n<td>\n<p align=\"right\">24 081 423<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>4%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">100 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">50 261 272<\/p>\n<\/td>\n<td>\n<p align=\"right\">48 016 813<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>4%<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f distinct<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"right\"><strong>\u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u043f\u0438\u0441\u043a\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"right\"><strong>Collection (ns)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"right\"><strong>Sequence (ns)<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">100<\/p>\n<\/td>\n<td>\n<p align=\"right\">83 113<\/p>\n<\/td>\n<td>\n<p align=\"right\">100 762<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-21%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">1 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">1 005 813<\/p>\n<\/td>\n<td>\n<p align=\"right\">1 169 785<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-16%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">10 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">10 851 783<\/p>\n<\/td>\n<td>\n<p align=\"right\">12 856 475<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-18%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">50 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">60 652 896<\/p>\n<\/td>\n<td>\n<p align=\"right\">69 893 855<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-15%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"right\">100 000<\/p>\n<\/td>\n<td>\n<p align=\"right\">129 569 604<\/p>\n<\/td>\n<td>\n<p align=\"right\">146 594 000<\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>-13%<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u044d\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u0434 \u043e\u0431\u0435\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0437\u0430 \u0441\u0447\u0435\u0442 \u0447\u0435\u0433\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u0442\u0435\u0440\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 distinct.<\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f distinct<\/h3>\n<p>\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f distinct \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u0412\u043d\u0443\u0442\u0440\u0438 \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 HashSet <em><u>observed<\/u><\/em> \u0438 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442 \u0432 \u043d\u0435\u043c \u0432\u0441\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 <em><u>observed<\/u><\/em>, \u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043e\u043d \u0443\u0436\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f.<\/p>\n<pre><code class=\"kotlin\">private class DistinctIterator&lt;T, K>(     private val source: Iterator&lt;T>,      private val keySelector: (T) -> K ) : AbstractIterator&lt;T>() {     private val observed = HashSet&lt;K>()      override fun computeNext() {         while (source.hasNext()) {             val next = source.next()             val key = keySelector(next)              if (observed.add(key)) {                 setNext(next)                 return             }         }          done()     } }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043a\u043e\u0434\u0430 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439, \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u0434. \u041f\u043e \u0441\u0443\u0442\u0438, \u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435. \u0421\u043e\u0437\u0434\u0430\u0435\u0442 HashSet \u0438 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442 \u0432 \u043d\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.<\/p>\n<pre><code class=\"kotlin\">public inline fun &lt;T, K> Iterable&lt;T>.distinctBy(     selector: (T) -> K ): List&lt;T> {     val set = HashSet&lt;K>()     val list = ArrayList&lt;T>()     for (e in this) {         val key = selector(e)         if (set.add(key))             list.add(e)     }     return list } <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f sequences \u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u0432 \u0446\u0435\u043b\u043e\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442, \u0442\u043e \u043f\u043e\u0442\u0435\u0440\u0438 \u0433\u0434\u0435 \u0442\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 sequences, \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043a\u0430\u043a\u043e\u0439 \u0442\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <strong>AbstractIterator<\/strong>.<\/p>\n<pre><code class=\"kotlin\">private class DistinctIterator&lt;T, K>(     private val source: Iterator&lt;T>,      private val keySelector: (T) -> K ) : AbstractIterator&lt;T>() {    \/\/ .... }<\/code><\/pre>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u0432 \u043d\u0435\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 distinct \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0430. \u0418 \u0435\u0441\u043b\u0438 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0435, \u0442\u043e \u0438 \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u043f\u043e\u0442\u0435\u0440\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435.<\/p>\n<h4>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 AbstractIterator<\/h4>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <em><u>state<\/u><\/em> \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u043b\u0441\u044f \u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u043e\u043d \u0435\u0449\u0435 \u043d\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u043b\u0441\u044f, \u0442\u043e \u043e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <strong>tryToComputeNext()<\/strong>, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0443\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.<\/p>\n<pre><code class=\"kotlin\">private enum class State {     Ready,     NotReady,     Done,     Failed }  public abstract class AbstractIterator&lt;T> : Iterator&lt;T> {     private var state = State.NotReady     private var nextValue: T? = null      override fun hasNext(): Boolean {         require(state != State.Failed)         return when (state) {             State.Done -> false             State.Ready -> true             else -> tryToComputeNext()         }     }      override fun next(): T {         if (!hasNext()) throw NoSuchElementException()         state = State.NotReady         @Suppress(\"UNCHECKED_CAST\")         return nextValue as T     }      private fun tryToComputeNext(): Boolean {         state = State.Failed         computeNext()         return state == State.Ready     }      \/**      * Computes the next item in the iterator.      *      * This callback method should call one of these two methods:      *      * * [setNext] with the next value of the iteration      * * [done] to indicate there are no more elements      *      * Failure to call either method will result in the iteration terminating with a failed state      *\/     abstract protected fun computeNext(): Unit      \/**      * Sets the next value in the iteration, called from the [computeNext] function      *\/     protected fun setNext(value: T): Unit {         nextValue = value         state = State.Ready     }      \/**      * Sets the state to done so that the iteration terminates.      *\/     protected fun done() {         state = State.Done     } } <\/code><\/pre>\n<p>\u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043a\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043e\u0447\u0435\u043d\u044c \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u043e \u0438 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0437\u0434\u0435\u0441\u044c \u0431\u044b\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e. \u041d\u043e \u0433\u0434\u0435 \u0436\u0435 \u043e\u043d\u0438 \u0442\u043e\u0433\u0434\u0430?<\/p>\n<p>\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 sequences \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>fliter<\/strong> \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043e\u0434\u043d\u0430\u043a\u043e, \u043e\u043d \u043d\u0435 \u0434\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0448\u0430 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c\u0438. \u042f \u043d\u0430\u0447\u0430\u043b \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u0432\u0443\u0445 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f.<\/p>\n<h4>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 filter<\/h4>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436. \u0422\u0443\u0442 \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u043e\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043f\u043e\u043b\u0435 <em><u>nextState<\/u><\/em><\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <strong>calcNext()<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0435\u0439 \u043c\u0435\u0442\u043e\u0434\u0430 <strong>tryToComputeNext()<\/strong> \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 distinct<\/p>\n<pre><code class=\"kotlin\">internal class FilteringSequence&lt;T>(     private val sequence: Sequence&lt;T>,     private val sendWhen: Boolean = true,     private val predicate: (T) -> Boolean ) : Sequence&lt;T> {      override fun iterator(): Iterator&lt;T> = object : Iterator&lt;T> {         val iterator = sequence.iterator()         \/\/ -1 for unknown, 0 for done, 1 for continue         var nextState: Int = -1          var nextItem: T? = null          private fun calcNext() {             while (iterator.hasNext()) {                 val item = iterator.next()                 if (predicate(item) == sendWhen) {                     nextItem = item                     nextState = 1                     return                 }             }             nextState = 0         }          override fun next(): T {             if (nextState == -1)                 calcNext()             if (nextState == 0)                 throw NoSuchElementException()             val result = nextItem             nextItem = null             nextState = -1             @Suppress(\"UNCHECKED_CAST\")             return result as T         }          override fun hasNext(): Boolean {             if (nextState == -1)                 calcNext()             return nextState == 1         }     } } <\/code><\/pre>\n<p>\u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u0435\u043b\u043a\u0438\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u044d\u0442\u0438 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b. <\/p>\n<h4>\u0422\u0430\u043a \u0433\u0434\u0435 \u0436\u0435 \u043f\u043e\u0442\u0435\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 distinct?<\/h4>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430, \u0432 \u0441\u0438\u043b\u0443 \u0441\u0432\u043e\u0435\u0439 \u043d\u0435\u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0446\u0438\u0438, \u044f \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u043b \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438 \u0432\u044b\u0437\u043e\u0432\u044b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u041d\u043e \u043d\u0435\u0442, \u0435\u0441\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u0432 \u043e\u0434\u0438\u043d \u043e\u0431\u0449\u0438\u0439 \u043a\u043b\u0430\u0441\u0441, \u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0435\u043c \u0435\u0449\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u044d\u0442\u0438 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &#8212; \u044d\u0442\u043e <strong>Enum<\/strong>. <\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 <strong>filter<\/strong> \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 \u0432\u0438\u0434\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 <strong>Int<\/strong><\/p>\n<pre><code class=\"kotlin\">        \/\/ -1 for unknown, 0 for done, 1 for continue         var nextState: Int = -1 <\/code><\/pre>\n<p>\u0410 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 <strong>distinct<\/strong> \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 <strong>Enum<\/strong><\/p>\n<pre><code class=\"kotlin\">private enum class State {     Ready,     NotReady,     Done,     Failed }      private var state = State.NotReady<\/code><\/pre>\n<blockquote>\n<p>\u041d\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <strong>Enum<\/strong> \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u0430\u0432\u0430\u0442\u044c <strong>15%<\/strong> \u043f\u043e\u0442\u0435\u0440\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/blockquote>\n<p>\u041d\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0438\u0437 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u043e\u0434\u0430 \u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0432\u0438\u0434\u0435\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0438\u043b \u0441\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0438\u0436\u0435 \u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0430\u043d\u0430\u043b\u0438\u0437\u0443 byte-code \u043e\u0431\u0435\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c byte-code \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <em><u>nextState<\/u><\/em> \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>filter<\/strong>, \u0442\u043e \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u043c \u0442\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043b\u0438\u0448\u043d\u0435\u0433\u043e. \u041f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u0441\u0442\u0435\u043a, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u044b\u0437\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u043a\u043e\u0434\u0430.<\/p>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c byte-code \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <em><u>state<\/u><\/em> \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>distinct<\/strong>, \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043d\u0435\u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435.<\/p>\n<p><strong>\u042d\u0442\u043e \u043a\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0442\u0435\u0439\u0442\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 distinct<\/strong><\/p>\n<pre><code class=\"java\">        return when (state) {             State.Done -> false             State.Ready -> true             else -> tryToComputeNext()         }<\/code><\/pre>\n<p><strong>\u0410 \u044d\u0442\u043e byte-code, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0443\u0435\u0442<\/strong><\/p>\n<pre><code class=\"java\">#1  private final hasNext()Z #2   L0 #3    LINENUMBER 20 L0 #4    ALOAD 0 #5    GETFIELD AbstractIterator.state : Lcom\/AbstractIterator$State; #6    GETSTATIC AbstractIterator$WhenMappings.$EnumSwitchMapping$0 : [I #7    SWAP #8    INVOKEVIRTUAL AbstractIterator$State.ordinal ()I #9    IALOAD #10   L1 #11    TABLESWITCH #12      1: L2 #13      2: L3 #14      default: L4 #15   L2 <\/code><\/pre>\n<p>\u041d\u0435 \u0434\u0443\u043c\u0430\u044e \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0443\u043c\u0435\u044e\u0442 \u0447\u0438\u0442\u0430\u0442\u044c byte-code (<em>\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u044f \u043d\u0435 \u0443\u043c\u0435\u043b<\/em>), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e.<\/p>\n<p><strong>#5<\/strong> &#8212; \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <em><u>state<\/u><\/em><br \/><strong>#6<\/strong> &#8212; \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u043c\u0430\u0441\u0441\u0438\u0432 ordinal \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <strong>enum<\/strong> \u043a\u043b\u0430\u0441\u0441\u0430<br \/><strong>#7<\/strong> &#8212; \u043c\u0435\u043d\u044f\u0435\u0442 \u0434\u0432\u0435 \u044d\u0442\u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0435\u043a\u0435<br \/><strong>#8<\/strong> &#8212; \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 ordinal \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <em><u>state<\/u><\/em><br \/><strong>#9<\/strong> &#8212; <strong>IALOAD<\/strong> \u0438\u0449\u0435\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 ordinal \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 enum \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 ordinal \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <em><u>state<\/u><\/em><br \/><strong>#11<\/strong> &#8212; \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0445\u043e\u0434 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0443 TABLESWITCH \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e \u043d\u0443\u0436\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u0435 \u043a\u043e\u0434\u0430. <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <strong>when<\/strong> \u0432 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441 <strong>enum<\/strong>, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u043b\u0438\u0448\u043d\u044e\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u0441\u0435\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 enum \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a.<\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 ordinal \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0442\u043e \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0439 \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0439 \u0438 \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/p>\n<pre><code class=\"kotlin\">        return when (state.ordinal) {             State.Done.ordinal -><\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-357846","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/357846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=357846"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/357846\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=357846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=357846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=357846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}