{"id":390056,"date":"2024-06-29T09:00:31","date_gmt":"2024-06-29T09:00:31","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=390056"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=390056","title":{"rendered":"<span>JDK Stream \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u043d\u0433 (\u0440\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f)<\/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<p>\u041f\u0440\u0438\u0432\u0435\u0442 all!<\/p>\n<h2>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041f\u0440\u0438\u0433\u043b\u044f\u043d\u0443\u043b\u0430\u0441\u044c \u043c\u043d\u0435 \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u0438\u0434\u0435\u044f \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u043d\u0433\u0430 (\u0440\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438) StreamAPI \u0438\u0437 JDK8. \u0427\u0442\u043e \u0438 \u043a\u0430\u043a \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u043e \u043e\u043f\u0438\u0448\u0443 \u0434\u0430\u043b\u0435\u0435.<\/p>\n<h2>\u0421\u0441\u044b\u043b\u043a\u0438<\/h2>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\" rel=\"noopener noreferrer nofollow\">\u0410\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/tree\/habr_pub1\" rel=\"noopener noreferrer nofollow\">\u0412\u0435\u0442\u043a\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438<\/a><\/p>\n<h2>\u0412\u043a\u0440\u0430\u0442\u0446\u0435<\/h2>\n<p>StreamAPI \u2014 \u044d\u0442\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0430\u044f\u0441\u044f \u0432 Java 8 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u043d\u0430\u0431\u043e\u0440\u0430\u0445 (\u043d\u0430\u043f\u0440. \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c\u0438) \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435 (\u043b\u044f\u043c\u0431\u0434\u0430-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438). \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e \u0441\u0442\u0440\u0438\u043c\u044b <a href=\"https:\/\/habr.com\/ru\/company\/luxoft\/blog\/270383\/\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0443\u0442<\/a>.<\/p>\n<h2>\u0417\u0430\u0447\u0435\u043c \u0438 \u0434\u043b\u044f \u0447\u0435\u0433\u043e<\/h2>\n<p>\u0414\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0439 \u0442\u0435\u043c\u044b. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u043d\u0435\u043c\u0430\u043b\u043e \u043e\u043f\u044b\u0442\u0430, \u043a\u0430\u043a \u043f\u043e \u0441\u0442\u0440\u0438\u043c\u0430\u043c, \u0442\u0430\u043a \u0438 \u0432 \u0446\u0435\u043b\u043e\u043c \u043f\u043e Java \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u0430 \u0440\u0435\u0432\u0435\u0440\u0441\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439. \u042f \u0431\u044b \u043f\u043e\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043b \u0438 \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c \u0438 \u0442\u0435\u043c \u043a\u0442\u043e \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u043f\u043e\u0432\u044b\u0448\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0442\u0440\u0438\u043c\u0430. \u0418 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0432\u0430\u0448\u0435\u0433\u043e \u043e\u043f\u044b\u0442\u0430, \u0432\u0430\u0441 \u0436\u0434\u0443\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \ud83d\ude42<\/p>\n<h2>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <strong><em>Stream Reversed \u2192 StreamRe \u2192 StreamEr \u2192 Streamer<\/em><\/strong><\/p>\n<h2>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438\/\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438<\/h2>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u043d\u0433, \u0446\u0435\u043b\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435, \u0442\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u043e\u0442 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u044f Enterprise. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0440\u0438\u043c\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u0443\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0443 \u0438\u0437 JDK \u043f\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e.<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0438\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u044b\u043b\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0438\u043c\u043e\u0432 (Parallel stream), \u0442.\u043a. \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u043d\u044b\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430.<\/p>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0442\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 StreamAPI:<\/p>\n<ul>\n<li>\n<p>\u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0422.\u0435., \u043f\u043e\u043a\u0430 \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0442\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u043c \u043d\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435 \u0447\u0438\u0442\u0430\u0435\u043c \u0435\u0433\u043e, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0431\u043e\u0440 \u043f\u0440\u0430\u0432\u0438\u043b, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0435\u0440 \u0441\u0442\u0440\u0438\u043c\u0430 \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0432 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0438 \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043d\u0435 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044f\u0441\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u0445, \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0438 \u0442.\u0434. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<\/ul>\n<h2>Spliterator vs. Iterator<\/h2>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b Stream \u043c\u043e\u0433 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0435\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f JDK (\u0434\u0430\u043b\u0435\u0435 \u00ab\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u00bb), \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c, \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043f\u043b\u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 &#8212; <code>Spliterator&lt;T><\/code>.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043f\u043b\u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u2014 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0431\u043b\u043e\u043a\u0438, \u0442.\u0435. \u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445. \u041f\u043e\u0440\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u00ab\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u043e\u043c\u00bb \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0438\u043c\u043e\u0432, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u0440\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e, \u043e \u0441\u043f\u043b\u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u0445 <a href=\"https:\/\/habr.com\/ru\/post\/256905\/\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0443\u0442<\/a>. <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c parallel \u0434\u043b\u044f \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430, \u0442\u043e \u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0431\u043b\u043e\u043a\u0438 \u0442\u043e\u0436\u0435 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0445\u0432\u0430\u0442\u0438\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440a &#8212; <code>Iterator&lt;T><\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u00ab\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u00bb \u0438\u043c\u0435\u043d\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430.<\/p>\n<h2> \u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b (\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f)<\/h2>\n<p> \u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b \u043d\u0430 \u0442\u0440\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>     <em>\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435     (WAITING)<\/em>     \u2014 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430. \u0412 \u044d\u0442\u043e\u043c     \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f. \u041f\u043e\u043a\u0430 \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u043c\u044b     \u043c\u043e\u0436\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432     \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u00ab\u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u00bb.<\/p>\n<\/li>\n<li>\n<p>     <em>\u0412     \u0440\u0430\u0431\u043e\u0442\u0435 (OPERATED) \u2014 <\/em>\u0432     \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435     \u0432\u044b\u0437\u043e\u0432\u0430 \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430. \u042d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043b\u0438\u0431\u043e \u0441\u0442\u0440\u0438\u043c\u0435\u0440     \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u2014 \u00ab\u043a\u043e\u043d\u0432\u0435\u0435\u0440 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u00bb, \u043b\u0438\u0431\u043e \u0433\u043e\u0442\u043e\u0432 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443, \u0442.\u0435. \u0443\u0436\u0435 \u0441\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u044b\u0437\u043e\u0432\u044b \u043a\u0430\u043a \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u044b\u0445 \u0442\u0430\u043a \u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0431\u043e\u043b\u0435\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b.<\/p>\n<\/li>\n<li>\n<p>     <em>\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d     (CLOSED) \u2014 <\/em>\u042d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b     \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b, \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043e\u0431\u043d\u0443\u043b\u0435\u043d\u0430 (RefCount \u0434\u043b\u044f GC).<em> <\/em>\u0412 \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a:      <\/p>\n<ul>\n<li>\n<p>         \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430 \u043b\u044e\u0431\u043e\u0433\u043e \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>findFirst()<\/code> \u0432\u0435\u0440\u043d\u0443\u043b \u00ab\u043f\u0435\u0440\u0432\u044b\u0439\u00bb \u044d\u043b\u0435\u043c\u0435\u043d\u0442.         \u0414\u0430\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0435\u0449\u0435 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c, \u043d\u043e \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441\u0432\u043e\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>         \u0412         \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0435 &#8212; <code>hasNext()<\/code>         \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u0441\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441 <code>true<\/code> \u043d\u0430 <code>false<\/code>.<\/p>\n<\/li>\n<li>\n<p>         \u0418\u0437\u0432\u043d\u0435, \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d \u043c\u0435\u0442\u043e\u0434 \u044f\u0432\u043d\u043e\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u2014         close()         \u0438         \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f \u0432 WAITING         \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438.         \u0414\u0430\u043d\u043d\u043e\u0435         \u0443\u0441\u043b\u043e\u0432\u0438\u0435 (WAITING) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c,         \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443         \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0441\u0442\u0440\u0438\u043c. \u0422\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u00ab\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u00bb,  \u0434\u0430\u043b\u0435\u0435 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h2>\n<p> \u0420\u0430\u0437\u0434\u0435\u043b\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u0441\u0442\u0440\u0438\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0442\u0440\u0438 \u0433\u0440\u0443\u043f\u043f\u044b:<\/p>\n<p>    <u>\u041f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0435 (factory)<\/u>:<em> <\/em><code>empty, of, generate, iterate<\/code><\/p>\n<p><em>    <\/em><u>\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435(intermediate)\/\u043a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u044b\u0435<\/u>: <code>peek, onClose, distinct, filter, skip, limit, sorted, map, mapToInt, mapToLong, mapToDouble, flatMap, flatMapToInt, flatMapToLong, flatMapToDouble<\/code><\/p>\n<p>    <u>\u0417\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0438\u0435 (terminal)<\/u>: <code>spliterator, unordered, forEachOrdered, collect, min, max, reduce, count, forEach, allMatch, anyMatch, noneMatch, findFirst, findAny, iterator, toArray<\/code><\/p>\n<p>    <u>\u041f\u0440\u043e\u0447\u0438\u0435<\/u>: <code>close, isParallel, sequential<\/code><\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u043c <code>Streamer&lt;T><\/code>, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>java.util.stream.Stream&lt;T><\/code>. \u041f\u043e\u0437\u0432\u043e\u043b\u0438\u043c IDE \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432\u0441\u0435\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0437\u0430\u0433\u043b\u0443\u0448\u0438\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>UnsupportedOperationException<\/code>.<\/p>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/blob\/a79ed1df4382b3acf9b57e14568f1d94018ae99b\/src\/main\/java\/pw\/komarov\/streamer\/Streamer.java\" rel=\"noopener noreferrer nofollow\"><strong>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a<\/strong><\/a>.<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435, \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 &#8212; \u00ab\u043e\u0434\u043d\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u0438\u043a\u043e\u0432\u00bb, \u0447\u0442\u043e\u0431\u044b \u0431\u043e\u043b\u0435\u0435 \u043a \u043d\u0438\u043c \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f:<\/p>\n<pre><code class=\"java\">@Override public Optional&lt;T> findFirst() {     return findAny(); \/\/\u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0441 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0440\u0438\u043c,                        \/\/\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 (First)    \/\/\u0438 \u0435\u0441\u0442\u044c \"\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439\" (Any) }  @Override public boolean isParallel() {     return false; \/\/\u043c\u044b \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435\u0433\u0434\u0430 false }  @Override public Stream&lt;T> sequential() {     return this; \/\/\u043c\u044b \"\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\", \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0440\u043d\u0435\u043c \u0441\u0435\u0431\u044f \u0436\u0435 }  @Override public void forEachOrdered(Consumer&lt;? super T> action) {     forEach(action); \/\/\u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u043c\u044b \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c,     \/\/\u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435     \/\/forEach \u0438 forEachOrdered \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b }  @Override public Spliterator&lt;T> spliterator() {     return Spliterators.spliteratorUnknownSize(this.iterator(),              Spliterator.ORDERED); \/\/\u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043f\u043b\u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440     \/\/\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u00ab\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e\u00bb \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 }  @Override public Stream&lt;T> unordered() {     return this; \/\/\u0442\u0430\u043a \u0436\u0435, \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0435\u0431\u044f }<\/code><\/pre>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432<\/h2>\n<p>\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c, \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u044b\u043c \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u043c (private) \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a. \u042d\u0442\u043e\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u043b\u0438\u0435\u043d\u0442\u044b \u0436\u0435, \u043a\u0430\u043a \u0438 \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0435, \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0437 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u0430\u0431\u0440\u0438\u043a. \u0421\u0442\u043e\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u043a \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0444\u0430\u0431\u0440\u0438\u043a\u0435 of() \u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0445 (Iterable) \u0442\u0438\u043f\u043e\u0432, \u0438 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u0437 \u0441\u0430\u043c\u0438\u0445 Iterator`\u043e\u0432.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430:<\/p>\n<pre><code class=\"java\">package pw.komarov.streamer;  import java.util.Arrays; import java.util.List; import java.util.concurrent.ThreadLocalRandom;  public class StreamerInstancesCreationExamples {     public static void main(String[] args) {         Streamer.empty(); \/\/\u043f\u0443\u0441\u0442\u043e\u0439          Streamer.of(new Object()); \/\/\u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442         Streamer.of(new Integer[]{1, 4, 8, 17}); \/\/\u043c\u0430\u0441\u0441\u0438\u0432         Streamer.of(Arrays.asList(7.34, 9, 18.7, 3)); \/\/Iterable (List)         Streamer.of(\"Foo\", \"Bar\", \"Juice\", \"hello\", \"streamer\"); \/\/\u0438\u0437 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442          \/\/Infinite         Streamer.generate(() -> ThreadLocalRandom.current().nextInt()); \/\/\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 (\u0440\u044d\u043d\u0434\u043e\u043c-\u0447\u0438\u0441\u043b\u043e)         Streamer.generate(() ->             {                 List strings = Arrays.asList(\"randomly\", \"returned\", \"string\", \"value\");                 return strings.get(ThreadLocalRandom.current().nextInt(strings.size()));             }); \/\/\u0440\u044d\u043d\u0434\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435          Streamer.iterate(100, (i) -> i * 2); \/\/\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c {100,200,400.........n}     } }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434\u044b <code>generate()<\/code> \u0438 <code>iterate()<\/code> \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0441\u0442\u0440\u0438\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e <code>hasNext()<\/code> \u0432\u0441\u0435\u0433\u0434\u0430 <code>== true<\/code> \u0438 \u00ab\u0437\u0430\u0433\u043b\u0443\u0448\u0435\u043d\u00bb \u043c\u0435\u0442\u043e\u0434 <code>forEachRemaining()<\/code>:<\/p>\n<pre><code class=\"java\">private static abstract class AbstractInfiniteIterator&lt;E>   implements Iterator&lt;E> {     @Override     public boolean hasNext() {         return true;     }      @Override     public void forEachRemaining(Consumer&lt;? super E> consumer) {         throw new UnsupportedOperationException();     } }<\/code><\/pre>\n<p> \u0418\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f <code>generate()<\/code>:<\/p>\n<pre><code class=\"java\">private static class InfiniteGenerator&lt;E>  extends AbstractInfiniteIterator&lt;E> {              private final Supplier&lt;E> supplier;          InfiniteGenerator(Supplier&lt;E> supplier) {         this.supplier = supplier;     }      @Override     public E next() {         return supplier.get();     } }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u044d\u0442\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0438 \u0437\u0430\u0442\u0435\u043c \u0438\u0437 \u043d\u0435\u0433\u043e \u0441\u0442\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"java\">public static &lt;E> Streamer&lt;E> generate(Supplier&lt;E> supplier) {     return of(new InfiniteGenerator&lt;>(supplier)); }<\/code><\/pre>\n<p>\u041f\u043e\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0438 <code>iterate()<\/code>:<\/p>\n<pre><code class=\"java\">public static class InfiniteIterator&lt;E>  extends AbstractInfiniteIterator&lt;E> {                    private E value; \/\/\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0448\u0430\u0433\u0430,     \/\/\u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u2014 initial      private final UnaryOperator&lt;E> unaryOperator; \/\/\u043a\u043b\u0438\u0435\u043d\u0441\u0442\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f      \/\/\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f      InfiniteIterator(E initial, UnaryOperator&lt;E> unaryOperator) {         this.value = initial;         this.unaryOperator = unaryOperator;     }      @Override     public E next() {         E prev = this.value;         this.value = unaryOperator.apply(prev);         return prev;     } }  public static &lt;E> Streamer&lt;E> iterate(E initial,                                        UnaryOperator&lt;E> unaryOperator) {        return of(new InfiniteIterator&lt;>(initial, unaryOperator)); } <\/code><\/pre>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/commit\/0831da78588e0b708f041ae12de3f801d145c20e#diff-7bf61ce18fd9d34a6f75fa6fb81be52d7ad1423beff0d551ca7fbdb1a3e1e450\" rel=\"noopener noreferrer nofollow\"><strong>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a<\/strong><\/a>.<\/p>\n<h2>\u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435\/\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041e\u043f\u0438\u0448\u0435\u043c \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\/\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430. \u041f\u0435\u0440\u0432\u044b\u0439 &#8212; <code>internalClose()<\/code> \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0412\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u0438\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0412 \u043e\u0431\u0449\u0435\u043c, \u0432 \u0442\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u0431\u043e\u043b\u0435\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a \u0436\u0435 \u043e\u0431\u043d\u0443\u043b\u044f\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b (\u0447\u0442\u043e\u0431\u044b \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c RefCount \u0434\u043b\u044f GC) \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u0432 CLOSED \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.    <\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u2014 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 <code>close()<\/code> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>AutoCloseable<\/code>. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0436\u0435, \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f WAITING. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u044b\u0437\u043e\u0432 \u043d\u0435 \u043c\u043e\u0433 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0441\u0442\u0440\u0438\u043c\u0430. \u0422\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b. \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u044d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0438 \u0432\u043e\u0442 \u043f\u043e\u0447\u0435\u043c\u0443: \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0441\u0442\u0440\u0438\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0442\u044f\u0436\u0435\u043b\u043e\u0432\u0435\u0441\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0412 \u043a\u0430\u043a\u043e\u0439 \u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 (\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u043b \u043e\u0442\u043c\u0435\u043d\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f), \u043c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u043c\u0441\u044f \u0432 \u044d\u0442\u043e\u0439 \u0442\u044f\u0436\u0435\u043b\u043e\u0432\u0435\u0441\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0438 \u0445\u043e\u0442\u0438\u043c \u0435\u0435 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c. \u0421\u0442\u0440\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u043d\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0442\u0440\u0438\u043c. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c <code>close()<\/code> \u0432 \u043d\u0430\u0434\u0435\u0436\u0434\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u043e \u043e\u043d \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u043d\u0438 \u0432 \u0447\u0435\u043c \u043d\u0435\u0431\u044b\u0432\u0430\u043b\u043e\u2026 \u0410 \u0436\u0430\u043b\u044c&#8230; \u0412\u0435\u0434\u044c \u0442\u0430\u043a \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c\u2026 :).<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 onClose \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439. \u041d\u043e \u0438 \u0442\u0443\u0442 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0432\u043e\u0445. \u042d\u0442\u0438 onClose \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u044f\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 close(). \u0422.\u0435. \u0435\u0441\u043b\u0438 \u0441\u0442\u0440\u0438\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b \u0440\u0430\u0431\u043e\u0442\u0443, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0438\u0441\u043a\u043e\u043c\u043e\u0435 (min, max \u0438 \u0442.\u0434.), \u0442\u043e onClose \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u0430 \u0432\u0435\u0434\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043c \u0431\u044b\u043b\u0438 \u0432\u0430\u0436\u043d\u044b\u0435 \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b&#8230; \u041f\u0440\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 onClose() \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u00ab\u0432\u0440\u0443\u0447\u043d\u0443\u044e\u00bb \u0438\u0437 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 close() \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440. \u041c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/blob\/f0f4a786987c1e3d9585d8863dbd0cf426f086f7\/src\/test\/java\/pw\/komarov\/streamer\/OnCloseTests.java\" rel=\"noopener noreferrer nofollow\">\u0422\u0435\u0441\u0442\u044b, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/a><\/p>\n<p>\u041d\u0443 \u0447\u0442\u043e \u0436\u0435, \u0438\u043c\u0435\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u0438\u043c\u0435\u0435\u043c&#8230; \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u044d\u0442\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 \u0442\u043e\u043c \u0436\u0435 \u0432\u0438\u0434\u0435:<\/p>\n<pre><code class=\"java\">private enum State {WAITING, OPERATED, CLOSED}  private State state = State.WAITING;  private final List&lt;Runnable> onCloseSequences = new LinkedList&lt;>();  @Override public void close() {     if (state == State.WAITING)         internalClose();      \/\/\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c (\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c) \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 onClose \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438...     RuntimeException rte = null;     for (Iterator&lt;Runnable> iterator = onCloseSequences.iterator(); iterator.hasNext(); ) {         Runnable runnable = iterator.next();         try {             runnable.run();         } catch (RuntimeException e) {             if (rte == null) \/\/\u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435...                 rte = e; \/\/...\u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0435\u0433\u043e             else \/\/\u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u0435\u0440\u0432\u043e\u0435...                 rte.addSuppressed(e); \/\/...\u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0435\u0433\u043e \u0432 suppressed \u043f\u0435\u0440\u0432\u043e\u0433\u043e         } finally {             iterator.remove();         }     }      if (rte != null)         throw rte; }  private void internalClose() {     externalIterator = null;      state = State.CLOSED; }  private void throwIfNotWaiting() {     if (state != State.WAITING)         throw new IllegalStateException(\"stream has already been operated upon or closed\"); }  @Override public Stream&lt;T> onClose(Runnable closeHandler) {     throwIfNotWaiting();      onCloseSequences.add(closeHandler);      return this; }<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 onClose() \u0434\u043b\u044f \u0441\u0442\u0440\u0438\u043c\u0430 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0435\u0441\u0442\u044c &#8212; \u043f\u043e\u0433\u0430\u0448\u0430\u0435\u0442\u0441\u044f \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f. \u041f\u0440\u043e\u0447\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c), \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 suppressed \u043f\u0435\u0440\u0432\u043e\u0433\u043e. \u0418 \u0435\u0441\u043b\u0438 \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0432\u043e\u0435, \u0442\u043e \u043e\u043d\u043e \u0438 \u0431\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 onClose`\u043e\u0432. \u042d\u0442\u043e\u0442 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0439 \u0432\u044b\u0448\u0435.<\/p>\n<h2>\u0420\u0430\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443<\/h2>\n<p>\u0420\u0430\u043d\u0435\u0435 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0440\u043e\u0441\u0430\u0435\u0442 <code>IllegalStateException<\/code> \u0435\u0441\u043b\u0438 \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u043d\u0435 \u0432 WAITING \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0435\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043c\u0435\u0441\u0442\u0430 \u0433\u0434\u0435 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e. \u0410 \u043d\u0443\u0436\u043d\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e \u0432\u0441\u0435\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0438 \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445, \u043a\u0440\u043e\u043c\u0435 \u00ab\u043e\u0434\u043d\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u0438\u043a\u043e\u0432\u00bb \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u043d\u0435\u0435, \u0442.\u043a. \u043e\u043d\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b. <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 Builder`a \u2014 \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u043b\u0435\u0441\u043a\u043e\u043f\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f (\u043f\u0440\u0438\u043c.: <code>object.method1().method2().method3().methodN()<\/code>\u2026), \u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0435\u0431\u044f. <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0448\u0430\u0431\u043b\u043e\u043d \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u043b \u0442\u0430\u043a\u043e\u0439 \u0432\u0438\u0434:<\/p>\n<pre><code class=\"java\">{     throwIfNotWaiting();                    \/\/todo: \u0442\u0443\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439      return this; }<\/code><\/pre>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 WAITING \u0432 OPERATED \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0430 \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u0440\u0430\u0431\u043e\u0442\u044b \u2014 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e. <\/p>\n<p>\u0420\u0435\u0437\u044e\u043c\u0438\u0440\u0443\u044f \u0432\u044b\u0448\u0435\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435, \u00ab\u0448\u0430\u0431\u043b\u043e\u043d\u00bb \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0432\u0438\u0434:<\/p>\n<pre><code class=\"java\">{     throwIfNotWaiting(); \/\/IllegalStateException \u0435\u0441\u043b\u0438 \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u0438\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0440\u0438\u043c\u0435\u0440      state = State.OPERATED; \/\/\u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043c \u0432 OPERATED  try {     ;\/\/todo: \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\u2026 } finally {     internalClose(); \/\/\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 }     throw new UnsupportedOperationException(\"will be soon\");  \/\/\u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u0440\u043e return :) }<\/code><\/pre>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/commit\/21761e5121870581ef15872798db299ad72fc9bf\" rel=\"noopener noreferrer nofollow\"><strong>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0442\u0430\u043a<\/strong><\/a>.<\/p>\n<h2>\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (intermediate\/conveyor)<\/h2>\n<p>\u041d\u0443 \u0432\u043e\u0442 \u043c\u044b \u0438 \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a \u043b\u043e\u0433\u0438\u043a\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430. \u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u0441\u0442\u0440\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0430\u0431\u043e\u0440\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043a \u0434\u0430\u043d\u043d\u044b\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u0440\u0438\u043c\u0443. \u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0432\u043e\u043f\u0440\u043e\u0441, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u043c \u00ab\u0441\u0442\u0440\u043e\u0438\u0442\u044c\u00bb \u043d\u0430\u0431\u043e\u0440\u044b \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439? <\/p>\n<p>\u0422\u0443\u0442 \u0432\u0441\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u0414\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441:<\/p>\n<pre><code class=\"java\">private interface IntermediateOperation {}<\/code><\/pre>\n<p> \u041d\u0430\u0431\u043e\u0440 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430:<\/p>\n<pre><code class=\"java\">private List&lt;IntermediateOperation> intermediateOperations =    new LinkedList&lt;>();<\/code><\/pre>\n<p> \u0410 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0437 \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432.  <\/p>\n<p>\u0418\u0437 \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u0442\u0440\u0438\u043c\u0430 \u0432\u044b\u0434\u0435\u043b\u0438\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443 \u2014 \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u044e\u0449\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f &#8212; \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0435\u0433\u043e \u043e\u0442 \u0442\u0438\u043f\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u2014 \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043b\u0435\u0435 \u043f\u043e \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u0443 \u0438\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0431\u0440\u043e\u0448\u0435\u043d \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0448\u0430\u0433\u0435. <\/p>\n<p>\u0412\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0445\u0441\u044f \u043a \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u044e\u0449\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c: <code>skip()<\/code>, <code>limit()<\/code>, <code>distinct()<\/code>, <code>filter()<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441:<\/p>\n<pre><code class=\"java\">private interface FilteringOperation&lt;T>  extends IntermediateOperation, Predicate&lt;T> {}<\/code><\/pre>\n<p><code>Predicate&lt;T><\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c (FunctionalInterface, <a href=\"https:\/\/habr.com\/ru\/post\/512730\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435<\/a>), \u0438 \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 &#8212; <code>boolean test()<\/code>. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c &#8212; \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u0443 \u0434\u0430\u043b\u044c\u0448\u0435, \u0438\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u00ab\u043e\u0442\u0431\u0440\u043e\u0448\u0435\u043d\u00bb.<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (\u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 skip):<\/p>\n<pre><code class=\"java\">private static class SkipOperation implements FilteringOperation {     private final long totalCount; \/\/\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432     \/\/\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \"\u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\"     private long processedCount; \/\/\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0436\u0435 \"\u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u044b\u0445\" \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432     \/\/\u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439          SkipOperation(long totalCount) {         this.totalCount = totalCount;     }      @Override     public boolean test(Object o) {         if (processedCount &lt; totalCount) {             processedCount++;                          return true; \/\/\u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u0430\u043b\u0435\u0435         }          return false; \/\/\u043e\u0442\u0431\u0440\u043e\u0441\u0438\u043c\/\u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442     } }  @Override public Stream&lt;T> skip(long n) {     throwIfNotWaiting(); \/\/\u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435      intermediateOperations.add(new SkipOperation(n)); \/\/\u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c    \/\/Skip-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0435 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.      return this; \/\/\u0432\u0435\u0440\u043d\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u00ab\u0441\u0435\u0431\u044f\u00bb    \/\/\u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u043b\u0435\u0441\u043a\u043e\u043f\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u044e\u0449\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">\/\/limit() private long filteredByLimit; \/\/\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \"\u043e\u0442\u0441\u0435\u044f\u043d\u044b\u0445\" limit'\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432  private class LimitOperation implements FilteringOperation {     private final long maxSize; \/\/\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438 \u0435\u0441\u0442\u044c \u043b\u0438\u043c\u0438\u0442      LimitOperation(long maxSize) {         this.maxSize = maxSize;     }      @Override     public boolean test(Object o) {         return maxSize &lt; ++filteredByLimit;     } }  @Override public Stream&lt;T> limit(long maxSize) {     throwIfNotWaiting();      intermediateOperations.add(new LimitOperation(maxSize));      return this; }  \/\/distinct()  private static class DistinctOperation implements FilteringOperation {     private Set&lt;Object> objects = new HashSet&lt;>();          @Override     public boolean test(Object o) {         return !objects.add(o);     } }  @Override public Stream&lt;T> distinct() {     throwIfNotWaiting();      intermediateOperations.add(new DistinctOperation());      return this; }  private static class FilterOperation&lt;T> implements FilteringOperation&lt;T> {     private final Predicate&lt;? super T> predicate;      public FilterOperation(Predicate&lt;? super T> predicate) {         this.predicate = predicate;     }      @Override     public boolean test(T t) {         return !predicate.test(t);     } }  @Override public Stream&lt;T> filter(Predicate&lt;? super T> predicate) {     throwIfNotWaiting();      intermediateOperations.add(new FilterOperation&lt;>(predicate));      return this; }<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041d\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u044e\u0449\u0438\u0435:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">\/\/sorted() public static class SortedOperation&lt;T> implements IntermediateOperation {     private final Comparator&lt;? super T> comparator;      public SortedOperation() {         this.comparator = null;     }      public SortedOperation(Comparator&lt;? super T> comparator) {         this.comparator = comparator;     } }  @Override public Stream&lt;T> sorted() {     throwIfNotWaiting();      intermediateOperations.add(new SortedOperation&lt;>());      return this; }  @Override public Stream&lt;T> sorted(Comparator&lt;? super T> comparator) {     throwIfNotWaiting();      intermediateOperations.add(new SortedOperation&lt;>(comparator));      return this; }  \/\/map() private static class MapOperation&lt;T, R> implements IntermediateOperation {     private final Function&lt;? super T, ? extends R> function;     MapOperation(Function&lt;? super T, ? extends R> function) {         this.function = function;     } }  @SuppressWarnings(\"unchecked\") @Override public &lt;R> Stream&lt;R> map(Function&lt;? super T, ? extends R> mapper) {     throwIfNotWaiting();      intermediateOperations.add(new MapOperation&lt;>(mapper));      return (Streamer&lt;R>) this; }  \/\/flatMap() private static class FlatMapOperation&lt;T, R> implements IntermediateOperation {     private final Function&lt;? super T, ? extends Stream&lt;? extends R>> function;     FlatMapOperation(Function&lt;? super T, ? extends Stream&lt;? extends R>> function) {         this.function = function;     } }  @SuppressWarnings(\"unchecked\") @Override public &lt;R> Stream&lt;R> flatMap(Function&lt;? super T, ? extends Stream&lt;? extends R>> mapper) {     throwIfNotWaiting();      intermediateOperations.add(new FlatMapOperation&lt;>(mapper));      return (Streamer&lt;R>) this; }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0442\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c peek. <s>peek-\u043d\u0435\u043f\u044c\u044e\u0449\u0438\u0439 \u0442\u0440\u0443\u0434\u043e\u0432\u0438\u043a<\/s>. peek-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u0430\u043a \u0438 onClose, \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435, \u0431\u0435\u0437 \u043a\u043b\u0430\u0441\u0441\u043e\u0432-\u043e\u0431\u0435\u0440\u0442\u043e\u043a \u043d\u0430\u0434 \u043d\u0438\u043c, \u0442.\u043a. peek \u0445\u043e\u0442\u044c \u0438 Intermediate \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u2014 peek-\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0412\u0421\u0415, \u0420\u0410\u0417\u041e\u041c, \u041f\u041e\u0421\u041b\u0415 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u041a\u0410\u0416\u0414\u041e\u0413\u041e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u0442\u0440\u0438\u043c\u043e\u043c.<\/p>\n<pre><code class=\"java\">\/\/peek()  private final List&lt;Consumer&lt;? super T>> peekSequences = new LinkedList&lt;>();  @Override public Stream&lt;T> peek(Consumer&lt;? super T> action) {     throwIfNotWaiting();      peekSequences.add(action);      return this; }<\/code><\/pre>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/commit\/3266f24ca8488a1778cc8fcd216de8e9f5add261#diff-7bf61ce18fd9d34a6f75fa6fb81be52d7ad1423beff0d551ca7fbdb1a3e1e450\" rel=\"noopener noreferrer nofollow\"><strong>\u0412 \u0438\u0442\u043e\u0433\u0435<\/strong><\/a>.<\/p>\n<h2>\u041a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0433\u043b\u0430\u0432\u043d\u043e\u0435 &#8212; \u043b\u043e\u0433\u0438\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u00ab\u043a\u043e\u043d\u0432\u0435\u0435\u0440\u0430\u00bb. \u041d\u0430 \u043f\u0430\u043b\u044c\u0446\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a: \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 (<strong>externalIterator<\/strong>) \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0437\u0430\u0442\u0435\u043c \u043e\u043d \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 (\u0438\u043b\u0438 \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442) \u043f\u043e \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u0443 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0432\u0448\u0435\u043c\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 \u00ab\u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439\u00bb (<strong>streamerIterator<\/strong>) \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440. <\/p>\n<p>\u041f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0432\u043e\u0434\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0430 \u2014 \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u0434\u0430 \u043f\u043e\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043d\u0430\u0441\u043e\u0441\u043e\u043c (\u043d\u0430\u0441\u043e\u0441 \u0442\u0443\u0442 <strong>externalIterator<\/strong>, \u043a\u0430\u0447\u0430\u0435\u0442 \u0440\u0435\u0447\u043d\u0443\u044e \u0432\u043e\u0434\u0443), \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0442\u0440\u0443\u0431\u0430\u043c, \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c (\u043a\u043e\u043d\u0432\u0435\u0435\u0440), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0441\u0435\u0438\u0432\u0430\u044e\u0442 \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0438 \u043f\u043e\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044e \u043f\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043a\u0440\u0430\u043d\u0430. \u041a\u0440\u0430\u043d \u0434\u043b\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f &#8212; <strong>streamerIterator<\/strong>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0433\u0434\u0435-\u0442\u043e, \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u0443\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u044b\u043b \u043e\u0442\u0431\u0440\u043e\u0448\u0435\u043d (\u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d), \u0442\u043e \u0438\u0437 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439. \u0418 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0414\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043b\u0438\u0431\u043e \u0432 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0435-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0430\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0442\u0430\u043a \u0436\u0435 \u0441\u043e\u043e\u0431\u0449\u0438\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044e: \u00ab\u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0412\u0430\u0441 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442\u00bb (<code>hasNext() == false<\/code>), \u043b\u0438\u0431\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044e.<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u0430 (\u0432\u043e\u0434\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0430):<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">private class StreamerIterator implements Iterator&lt;T> {     private Boolean hasNext;     private T next;      @Override     public boolean hasNext() {         if (hasNext == null) {              calcNextAndHasNext();              if (!hasNext &amp;&amp; state != State.CLOSED) \/\/\u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0430\u043d\u043d\u044b\u0445...                 internalClose(); \/\/...\u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043c         }          return hasNext;     }      @Override     public T next() {         if (!hasNext()) \/\/\u0437\u0430\u043f\u0440\u043e\u0441\u0438\u043b\u0438, \u043d\u043e \u043d\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432?...             throw new NoSuchElementException(); \/\/... \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 exception          hasNext = null; \/\/\u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 hasNext \u0432 \u00ab\u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u00bb          return next;     }      private void calcNextAndHasNext() { \/\/\u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0435 \u043f\u043e\u043b\u044f next \u0438 hasNext \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0438\u0437 getNext()         Optional&lt;T> opt = getNext(intermediateOperations);          \/\/noinspection OptionalAssignedToNull         hasNext = opt != null; \/\/\u0435\u0441\u043b\u0438 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b \u043d\u0435 null \u2014 \u0435\u0441\u0442\u044c\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 = true         if (hasNext) \/\/\u0430 \u0435\u0441\u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0435\u0441\u0442\u044c \u2014 \u0442\u043e...             next = opt.orElse(null); \/\/\u2026 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u0430 (\u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u0435 \u043d\u0435\u0442 \u2014 \u0442\u043e \u043e\u043d\u043e null     }      \/\/\u0432\u043e\u0434\u043e\u043f\u0440\u043e\u0432\u043e\u0434:     @SuppressWarnings(\"unchecked\")     private Optional&lt;T> getNext(List&lt;IntermediateOperation> operations) {         T next = null;         boolean terminated = false;         boolean hasNext = externalIterator.hasNext();          while (hasNext &amp;&amp; !terminated) {             next = externalIterator.next();             boolean filtered = false;             for (IntermediateOperation operation : operations) \/\/\u043f\u0440\u043e\u0439\u0434\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c                 if (operation instanceof FilteringOperation) { \/\/\u0435\u0441\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f - \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u044e\u0449\u0430\u044f...                     if (!filtered) { \/\/\u2026 \u0438 \u043d\u0435 \u0431\u044b\u043b\u0430 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u0430 \u0440\u0430\u043d\u0435\u0435                         filtered = ((FilteringOperation&lt;T>)operation).test(next); \/\/\u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c? (test`\u043e\u043c)                         if (filtered &amp;&amp; operation instanceof LimitOperation)                             terminated = true; \/\/\u0430 \u0435\u0441\u043b\u0438 \u0431\u044b\u043b\u0430 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u0430 \u043b\u0438\u043c\u0438\u0442\u043d\u043e\u0439 \u2014 \u0442\u043e \u0435\u0449\u0435 \u0438 \u043f\u0440\u0435\u0440\u0432\u0435\u043c while                     }                 } else if (operation instanceof MapOperation) \/\/\u0435\u0441\u043b\u0438 map-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f                     next = (T) ((MapOperation)operation).function.apply(next);                 else                     throw new UnsupportedOperationException(\"getNext(): \" + operation.getClass().getSimpleName()); \/\/\u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f             if (!filtered)                 break;             else                 hasNext = externalIterator.hasNext();         }          if (hasNext &amp;&amp; !terminated) { \/\/\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e peek-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438             for (Consumer&lt;? super T> peekSequence : peekSequences)                 peekSequence.accept(next);              return Optional.ofNullable(next);         }          \/\/noinspection OptionalAssignedToNull         return null;     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041e\u0431\u044a\u044f\u0432\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e (\u043a\u0440\u0430\u043d \u0432\u043e\u0434\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0430):<\/p>\n<pre><code class=\"java\">private final StreamerIterator streamerIterator = new StreamerIterator();<\/code><\/pre>\n<p><strong>UPD1<\/strong>:<\/p>\n<blockquote>\n<p>P.S. \u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441. Optional \u0443 \u043c\u0435\u043d\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c null`\u043e\u043c. \u0414\u0430 \u043c\u043e\u0436\u0435\u0442, \u0438 \u044d\u0442\u043e \u0435\u0433\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435. \u041d\u0435 \u043d\u0430\u0448\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b == null, \u043d\u0430\u0448\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 (\u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d\u043e null), \u0438\u043d\u0430\u0447\u0435 \u043a\u0430\u043a\u0430\u044f \u043f\u043e\u043b\u044c\u0437\u0430 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u0430? \u0414\u0430 \u043d\u0438\u043a\u0430\u043a\u043e\u0439! \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u0442\u0430\u043a\u043e\u0435 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0435 \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0439. \u041d\u043e, \u0432 \u0441\u0432\u043e\u0435\u043c \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043a\u043e\u0434\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 <code>NullableOptional&lt;><\/code>. \u041f\u043e\u043c\u0438\u043c\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c EMPTY (\u0432 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e), \u0432 \u043d\u0435\u043c \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u0438 \u043d\u0435\u043a\u0438\u0439 \u0441\u0430\u0445\u0430\u0440, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>elseIf()<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043d\u0435 \u043f\u0435\u0440\u0435\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0432 JDK <code>Optional&lt;><\/code> \u043a\u0430\u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u044f <code>ifPresent()<\/code>. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e <code>Optional&lt;><\/code> \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043a\u0430\u043a <code>final<\/code> \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0439 NullableOptional \u0440\u0430\u0441\u0442\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0435\u0439. \u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043c\u043e\u0436\u0435\u0442\u0435 \u0433\u043b\u044f\u043d\u0443\u0442\u044c (\u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435 unit-\u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u043f\u0440\u0438\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f): <\/p>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/compare\/NullableOptional\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/koma1\/Streamer\/compare\/NullableOptional<\/a><\/p>\n<\/blockquote>\n<blockquote>\n<p>\u0438\u043d\u0430\u0447\u0435 \u043a\u0430\u043a\u0430\u044f \u043f\u043e\u043b\u044c\u0437\u0430 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u0430? \u0414\u0430 \u043d\u0438\u043a\u0430\u043a\u043e\u0439!<\/p>\n<\/blockquote>\n<p>\u0411\u0435\u0440\u0443 \u044d\u0442\u0438 \u0441\u043b\u043e\u0432\u0430 \u043d\u0430\u0437\u0430\u0434, \u043f\u043e\u043b\u044c\u0437\u0430 \u043e\u0442 \u043d\u0435\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0435\u0441\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u043e\u043d\u0430\u0434. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435: <a href=\"https:\/\/habr.com\/ru\/company\/cit\/blog\/262055\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/company\/cit\/blog\/262055\/<\/a><\/p>\n<p>\u0422\u0430\u043a \u0436\u0435, \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0430 Optional \u044d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u0430. <code>Optional&lt;><\/code> \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <code>null<\/code>. \u0414\u043b\u044f null-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 wrapper &#8212;<code>NullableValue&lt;><\/code>. \u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a Optional \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c null \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0438\u043b\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c null, \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 == null.<\/p>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/commit\/10e9c7f7711278ccd5ced1b5f1ce2bff7c915037\" rel=\"noopener noreferrer nofollow\">Diff<\/a><\/p>\n<h2>\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a<\/h2>\n<p>\u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0432\u0443\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432: <code>iterator()<\/code> \u0438 <code>forEach()<\/code>:<\/p>\n<pre><code class=\"java\">@Override public Iterator&lt;T> iterator() {     throwIfNotWaiting(); \/\/\u0431\u0440\u043e\u0441\u0438\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0432 WAITING \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438      state = State.OPERATED; \/\/\u0441\u043c\u0435\u043d\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430 OPERATED      return streamerIterator; \/\/\u0432\u0435\u0440\u043d\u0435\u043c \u00ab\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439\u00bb \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 - (\u043a\u0440\u0430\u043d) }  @Override public void forEach(Consumer&lt;? super T> action) {     throwIfNotWaiting();      state = State.OPERATED;      while (streamerIterator.hasNext()) \/\/\u043f\u043e\u043a\u0430 \u0432 \u00ab\u043a\u0440\u0430\u043d\u0435\u00bb \u0435\u0441\u0442\u044c \u0432\u043e\u0434\u0430...         action.accept(streamerIterator.next());\/\/...\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c action \u043a \u044d\u0442\u043e\u0439 \u0432\u043e\u0434\u0435 }<\/code><\/pre>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/commit\/432ff49d4c40348674555d071eb4d00a92e322e6#diff-7bf61ce18fd9d34a6f75fa6fb81be52d7ad1423beff0d551ca7fbdb1a3e1e450\" rel=\"noopener noreferrer nofollow\"><strong>\u041a\u043e\u043c\u043c\u0438\u0442\u0443\u0448\u043a\u0430<\/strong><\/a><\/p>\n<p>\u041f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c:<\/p>\n<pre><code class=\"java\">final Stream&lt;?> stream =     Streamer         .of(108, 5, 12, 11, 4, 9, 7, 5) \/\/\u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043d\u0430\u0431\u043e\u0440\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442             .distinct() \/\/(108, 5, 12, 11, 4, 9, 7, [5]) - \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u043c \u0434\u0443\u0431\u043b\u0438             .skip(1)    \/\/([108], 5, 12, 11, 4, 9, 7) - \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u043c \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 - \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442             .limit(6)   \/\/(5, 12, 11, 4, 9, 7) - \u043b\u0438\u043c\u0438\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0432 \u0448\u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432             .limit(5)   \/\/(5, 12, 11, 4, 9, [7]) - \u0438\u0445 \u0432\u0441\u0435\u0433\u043e \u0448\u0435\u0441\u0442\u044c,,,, \u0437\u043d\u0430\u0447\u0438\u0442 \u043b\u0438\u043c\u0438\u0442\u0438\u0440\u0443\u0435\u043c \u0432 \u043f\u044f\u0442\u044c :)             .map(i -> i == 11 ? 12 : i) \/\/(5, 12, [11]->12, 4, 9) \/\/\u0442\u0430\u043c \u0433\u0434\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 == 11, \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u043d\u0430 12, \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 - \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u0430\u043a \u0435\u0441\u0442\u044c             .distinct() \/\/(5, 12, [12], 4, 9) \/\/\u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043e\u0442\u0441\u0435\u0438\u043c \u043d\u043e\u0432\u044b\u0435 \u0434\u0443\u0431\u043b\u0438             .map(i -> (i &amp; 1) == 1 ? i * 2 : i) \/\/([5]->10, 12, 4, [9]->18) \u043a\u0430\u0436\u0434\u043e\u0435 \u043d\u0435\u0447\u0435\u0442\u043d\u043e\u0435 \u0443\u043c\u043d\u043e\u0436\u0438\u043c \u043d\u0430 \u0434\u0432\u0430, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u0430\u043a \u0435\u0441\u0442\u044c             .skip(1) \/\/([10], 12, 4, 18) - \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u043c \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 - \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442             .map(String::valueOf) \/\/(\"12\", \"4\", \"18\") - \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0432 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 (\u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0438 \u0442\u0438\u043f \u0441\u0442\u0440\u0438\u043c\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043a\u0430\u043a &lt;?>)             .map(s -> s.equals(\"12\") ? \"twelve\" : s.equals(\"18\") ? \"eighteen\" : String.format(\"(%s)unknown\", s)) \/\/\u0442\u043e, \u0447\u0442\u043e \u0437\u043d\u0430\u0435\u043c, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0432 \u0441\u0442\u0440\u043e\u043a\u0438         ;   stream.forEach(System.out::println); \/\/(\"twelve\", \"(4)unknown\", \"eighteen\")<\/code><\/pre>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/commit\/4f899b353166a3cabd13fca7cde987a93b2d252c#diff-d97efb4d76078f2353c8fa2ed79216bd53cc6d9813a95a0662e30a3d1afb68f0\" rel=\"noopener noreferrer nofollow\"><strong>\u0412\u0435\u0440\u0441\u0438\u044f \u043d\u0430 github`e<\/strong><\/a><\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f:<\/p>\n<pre><code>twelve (4)unknown eighteen  Process finished with exit code 0<\/code><\/pre>\n<p>\u0412\u043f\u043e\u043b\u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439. \u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u00ab\u0445\u0438\u0442\u0440\u043e\u0441\u0442\u044c\u00bb, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c <code>Streamer.of<\/code> \u043d\u0430 <code>Stream.of<\/code> \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u00ab\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u00bb. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439. \u041d\u0443 \u0432\u043e\u0442 \u043c\u044b \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u0434\u0432\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430. \u0418\u0437 \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u044b\u0445, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b: <code>sorted()<\/code> \u0438 \u043c\u044d\u043f\u043f\u0435\u0440\u044b (mapTo\u2026, flatMap(), flatMapTo&#8230;). \u042d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/p>\n<h2>sorted()<\/h2>\n<p>\u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u2014 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u0442\u0440\u0438\u043c\u0435. \u0414\u0435\u043b\u0430\u0435\u0442 \u043e\u043d \u044d\u0442\u043e Comparator`\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0435, \u043b\u0438\u0431\u043e \u043a\u043e\u043c\u043f\u0430\u0440\u0430\u0442\u0430\u0440\u043e\u043c \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u0441\u0442\u0440\u0438\u043c\u0435 \u0442\u0438\u043f\u0430. \u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c Comparable \u0441 \u0441\u043e\u0431\u043e\u0439 \u0436\u0435 (\u0438\u043d\u0430\u0447\u0435 &#8212; <code>ClassCastException<\/code>).<\/p>\n<p>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438  \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439, \u0442.\u0435. \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p> \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code>streamer.iterate(\u2026)   .limit(\u2026) \/\/ 1.1 .sorted() \/\/1   .distinct(\u2026) \/\/2.1   .filter(\u2026) \/\/2.2 .sorted() \/\/2   .map(\u2026) \/\/3.1   .distinct(\u2026) \/\/3.2 .sorted() \/\/3   .skip(\u2026)   \/\/n.1   .filter(\u2026)  \/\/n.2<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0442\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0430 \u0441 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u00abn.1\u00bb \u0438 \u00abn.2\u00bb \u043d\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u044e\u0442\u0441\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0432\u0445\u043e\u0434\u044f\u0442 \u0432 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u00ab\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u0431\u043b\u043e\u043a\u00bb. <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u0439\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0443\u0442\u0435\u043c:<\/p>\n<ol>\n<li>\n<p> \u0432\u044b\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u00ab\u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a-\u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u00bb \u0432 \u043a\u0430\u043a\u043e\u0439 \u043b\u0438\u0431\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 (\u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f, \u043c\u0430\u0441\u0441\u0438\u0432, \u0444\u0430\u0439\u043b \u0438 \u0442.\u0434.)<\/p>\n<\/li>\n<li>\n<p> \u00ab\u041f\u0440\u043e\u0433\u043d\u0430\u0442\u044c\u00bb \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u00ab\u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430\u00bb<\/p>\n<\/li>\n<li>\n<p> \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u0441\u043e\u0440\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0435 \u043a\u043e\u043c\u043f\u0430\u0440\u0430\u0442\u043e\u0440\u0430 (\u043b\u0438\u0431\u043e \u043a\u043e\u043c\u043f\u0430\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e).<\/p>\n<\/li>\n<li>\n<p> \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u043d\u0430 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u044d\u0442\u043e\u0439 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u044d\u0442\u043e \u043d\u0430\u043c\u0438 \u0436\u0435 \u043f\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u043d\u044b\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.<\/p>\n<\/li>\n<li>\n<p> \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u00ab\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u0431\u043b\u043e\u043a\u00bb \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0437\u0430\u043d\u043e\u0432\u043e, \u0441 \u043f\u0443\u043d\u043a\u0442\u0430 \u21161. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0431\u044b\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u00ab\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u0431\u043b\u043e\u043a\u00bb, \u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043e\u043a \u043e\u043a\u043e\u043d\u0447\u0435\u043d\u043e\u0439 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u0443 \u0441 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u043c \u043d\u0430 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u0415\u0441\u043b\u0438 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u044f\u0437\u044b\u043a\u043e\u043c \u043a\u043e\u0434\u0430, \u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434-\u0441\u043f\u043e\u0439\u043b\u0435\u0440<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">\/\/sorted() private int sortedCount; \/\/\u043f\u043e\u043b\u0435 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430, \u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u043e\u043b-\u0432\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438  ...    intermediateOperations.add(...); sortedCount++;  ...  @Override public boolean hasNext() {     if (hasNext == null) {          if (sortedCount > 0) \/\/\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438...             calculateSorted(); \/\/\u2026 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0445...          calcNextAndHasNext(); ... @SuppressWarnings({\"OptionalAssignedToNull\",\"unchecked\"}) private void calculateSorted() {     for (int i = 1; i &lt;= sortedCount; i++) { \/\/\u0446\u0438\u043a\u043b \u043f\u043e \u00ab\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u043c \u0431\u043b\u043e\u043a\u0430\u043c\u00bb          final List&lt;IntermediateOperation> localOperations = new LinkedList&lt;>();         SortedOperation&lt;T> sortedOperation = null;         for (Iterator&lt;IntermediateOperation> itr = intermediateOperations.iterator(); itr.hasNext(); ) {             IntermediateOperation operation = itr.next();             try {                 if (operation instanceof SortedOperation) { \/\/\u0435\u0441\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u2014 \u0432\u044b\u0434\u0435\u043b\u0438\u043c \u044d\u0442\u043e\u0442 \u0431\u043b\u043e\u043a...                     sortedOperation = (SortedOperation&lt;T>) operation;                     break;                 } else                     localOperations.add(operation);             } finally {                 itr.remove();             }         }          \/\/\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u00ab\u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430\u00bb \u0441\u043e\u0431\u0435\u0440\u0435\u043c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e         final List&lt;T> data = new ArrayList&lt;>();         Optional&lt;T> nextOpt;         do {             nextOpt = getNext(localOperations);             if (nextOpt != null)                 data.add(nextOpt.orElse(null));         } while (nextOpt != null);          \/\/\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a...         if (sortedOperation != null)             data.sort(sortedOperation.comparator);          \/\/\u043f\u043e\u0434\u043c\u0435\u043d\u0438\u043c \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440         externalIterator = data.iterator();     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/commit\/3b60e9b6bd18bb4107703a3798b06fe4d0bf9d69\" rel=\"noopener noreferrer nofollow\"><strong>diff commit`a<\/strong><\/a><\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u0435 \u0442\u0430\u043a \u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d \u0438 <em>StressRunner<\/em> \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043e\u043a.<\/p>\n<h2>flatMap()<\/h2>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0440\u0438\u043c, \u00ab\u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044f\/\u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044f\/\u0440\u0430\u0441\u0445\u043b\u043e\u043f\u044b\u0432\u0430\u044f\u00bb \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0441\u0442\u0440\u0438\u043c\u0430. \u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code>- element1 - subelement1_FROM_element1 - subelement2_FROM_element1 - subelement3_FROM_element1 - element2 - subelement4_FROM_element2 - subelement5_FROM_element2<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">@Override public &lt;R> Stream&lt;R> flatMap(Function&lt;? super T, ? extends Stream&lt;? extends R>> mapper) {     Objects.requireNonNull(mapper);      throwIfNotWaiting();      Stream&lt;R> result = Stream.empty();      for (T t : this)         result = Stream.concat(result, mapper.apply(t));      return result; }<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e. \u0412 \u043d\u0435\u043c \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0439 \u0441\u0442\u0440\u0438\u043c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c. \u0414\u0430\u043d\u043d\u044b\u0435 \u0432 \u043d\u0435\u043c \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u0437\u0430\u0442\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f (\u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f) \u0432 \u043e\u0431\u0449\u0438\u0439 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. <a href=\"https:\/\/github.com\/koma1\/Streamer\/blob\/bdac1bf0292e92aa33e909557117518ab36777f6\/src\/test\/java\/pw\/komarov\/streamer\/FlatMapRunner.java\" rel=\"noopener noreferrer nofollow\">\u042d\u0442\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440<\/a>.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0435\u0434\u0438\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439, \u043c\u0430\u0441\u0441\u043e\u0432\u044b\u0439 \u00ab\u0432\u044b\u0431\u0440\u043e\u0441\u00bb \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c. \u041d\u0430\u0441 \u044d\u0442\u043e \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442, \u043c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c \u00ab\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u00bb \u00ab\u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0441\u0442\u0438\u00bb. <\/p>\n<p>\u0418\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0432 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u0443\u044e \u0438\u0434\u0435\u044e: <\/p>\n<p>\u041e\u043f\u0438\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0442\u0438\u043f\u0430 \u2014 <em>OfR<\/em> (Iterator). \u041d\u0430 \u0432\u0445\u043e\u0434 \u0435\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u0442\u0440\u0438\u043c\u0430 &#8212; <em>OfT<\/em> (Iterator) \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>mapper<\/em>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u2014 <em>ofT<\/em> \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 &#8212; <em>ofR<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0443. <\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438:<\/p>\n<p>\u0423 \u0441\u0442\u0440\u0438\u043c\u0430  \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 &#8212; <code>next()<\/code>. \u041e\u043d \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b, \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0435\u0433\u043e \u0442\u0430\u043a\u043e\u0432\u043e\u0439. \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u043e\u0439 \u0438\u043c\u0435\u0435\u0442\u0441\u044f, \u0435\u0433\u043e \u0438 \u0432\u0435\u0440\u043d\u0435\u043c. \u0415\u0441\u043b\u0438 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0432\u0443\u0435\u0442 &#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u0441\u0442\u0440\u0438\u043c\u0435. \u0415\u0441\u043b\u0438 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u0441\u0442\u0440\u0438\u043c\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 &#8212; \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u043c \u0435\u0433\u043e, \u0438 \u043d\u0430\u0447\u043d\u0435\u043c \u0437\u0430\u043d\u043e\u0432\u043e. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043d\u0435\u0442 &#8212; <code>hasNext() = false<\/code><\/p>\n<p>\u041a\u043e\u0434:<\/p>\n<pre><code class=\"java\">\/\/flatMap()  @Override public &lt;R> Stream&lt;R> flatMap(Function&lt;? super T, ? extends Stream&lt;? extends R>> mapper) {     Objects.requireNonNull(mapper);      class IteratorOfR implements Iterator&lt;R> {         private final Iterator&lt;T> OfT = Streamer.this.iterator(); \/\/\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 (\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c)         private Iterator&lt;? extends R> ofR; \/\/\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 Stream&lt;R>, \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 ofT, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438 \u0431\u0443\u0434\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0443                  @Override         public R next() {             if (!hasNext())                 throw new NoSuchElementException();              return ofR.next();         }          @Override         public boolean hasNext() {             while ((ofR == null || !ofR.hasNext()) &amp;&amp; OfT.hasNext()) \/\/\u0435\u0441\u043b\u0438 ofR \u043d\u0435 \u0437\u0430\u0434\u0430\u043d (\u043d\u0430\u043f\u0440.: \u043f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441), \u0438\u043b\u0438 \u0432 ofR \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c (ofT)...                 ofR = mapper.apply(OfT.next()).iterator(); \/\/...\u0440\u0430\u0437\u043b\u043e\u0436\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 ofT \u0432 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e ofR             return ofR != null &amp;&amp; ofR.hasNext();         }     }      return Streamer.of(new IteratorOfR()); }<\/code><\/pre>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, IteratorOfR \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c (enclosure) \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 flatMap() \u043d\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/commit\/51dc50c2c3ff9c429d1ed7b3046081e8e664f396\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u043c\u043c\u0438\u0442 \u043d\u0430 github&#8217;e<\/a><\/p>\n<h2>[flat]MapTo{Int\/Long\/Double}()<\/h2>\n<p>\u042d\u0442\u043e\u0442 \u043d\u0430\u0431\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e. \u0412\u0441\u0435 \u043e\u043d\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0441\u0442\u0440\u0438\u043c \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0442\u0440\u0435\u0445 \u0442\u0438\u043f\u043e\u0432: <code>IntStream<\/code>, <code>LongStream<\/code>, <code>DoubleStream<\/code>. \u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441\u0442\u0440\u0438\u043c\u043e\u0432, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043e\u043d\u0438 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430\u043c\u0438, \u0430 \u043d\u0435 \u043e\u0431\u0435\u0440\u0442\u043a\u0430\u043c\u0438. \u0418\u0437\u0437\u0430 \u044d\u0442\u043e\u0433\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 IntStream \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0447\u0438\u0441\u043b\u0430\u043c\u0438, \u0447\u0435\u043c <code>Stream&lt;Integer><\/code>, \u0432\u0435\u0434\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441 \u043e\u0431\u0435\u0440\u0442\u043a\u043e\u0439. \u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 mapTo[Int\/Long\/Double]() \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u0442\u0438\u043f\u044b, \u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e <code>map()<\/code> \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <code>flatMap()<\/code>, \u0437\u0430 \u0442\u0435\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0447\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0441\u0442\u0440\u0438\u043c\u0430 \u043d\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c mapper`\u043e\u043c \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443. \u0417\u0432\u0443\u0447\u0438\u0442 \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u043d\u043e, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u0434:<\/p>\n<pre><code class=\"java\">@Override public IntStream mapToInt(ToIntFunction&lt;? super T> mapper) {      Objects.requireNonNull(mapper);      class OfInt implements PrimitiveIterator.OfInt {          @Override         public int nextInt() {             return mapper.applyAsInt(streamerIterator.next());         }         @Override         public boolean hasNext() {             return streamerIterator.hasNext();         }     }      return StreamSupport             .intStream(                     Spliterators.spliteratorUnknownSize(                             new OfInt(),                             0),                     false); }<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u044b &#8230;mapTo&#8230;() \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0441\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434-\u0441\u043f\u043e\u0439\u043b\u0435\u0440<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">@Override public LongStream mapToLong(ToLongFunction&lt;? super T> mapper) {     Objects.requireNonNull(mapper);      class OfLong implements PrimitiveIterator.OfLong {         private final Iterator&lt;T> ofT = Streamer.this.iterator();          @Override         public long nextLong() {             return mapper.applyAsLong(ofT.next());         }          @Override         public boolean hasNext() {             return ofT.hasNext();         }     }      return StreamSupport             .longStream(                     Spliterators.spliteratorUnknownSize(                             new OfLong(),                             0),                     false); }  @Override public DoubleStream mapToDouble(ToDoubleFunction&lt;? super T> mapper) {     Objects.requireNonNull(mapper);      class OfDouble implements PrimitiveIterator.OfDouble {         private final Iterator&lt;T> ofT = Streamer.this.iterator();          @Override         public double nextDouble() {             return mapper.applyAsDouble(ofT.next());         }          @Override         public boolean hasNext() {             return ofT.hasNext();         }     }      return StreamSupport             .doubleStream(                     Spliterators.spliteratorUnknownSize(                             new OfDouble(),                             0),                     false); }  @Override public IntStream flatMapToInt(Function&lt;? super T, ? extends IntStream> mapper) {     Objects.requireNonNull(mapper);      class OfInt implements PrimitiveIterator.OfInt {         private final Iterator&lt;T> ofT = Streamer.this.iterator();         private PrimitiveIterator.OfInt ofInt;           @Override         public int nextInt() {             if (!hasNext())                 throw new NoSuchElementException();              return ofInt.next();         }          @Override         public boolean hasNext() {             while ((ofInt == null || !ofInt.hasNext()) &amp;&amp; ofT.hasNext())                 ofInt = mapper.apply(ofT.next()).iterator();              return ofInt != null &amp;&amp; ofInt.hasNext();         }     }      return StreamSupport.intStream(             Spliterators.spliteratorUnknownSize(new OfInt(), 0),             false     ); }  @Override public LongStream flatMapToLong(Function&lt;? super T, ? extends LongStream> mapper) {     Objects.requireNonNull(mapper);      class OfLong implements PrimitiveIterator.OfLong {          private final Iterator&lt;T> ofT = Streamer.this.iterator();         private PrimitiveIterator.OfLong ofLong;          @Override         public long nextLong() {             if (!hasNext())                 throw new NoSuchElementException();              return ofLong.next();         }          @Override         public boolean hasNext() {             while ((ofLong == null || !ofLong.hasNext()) &amp;&amp; ofT.hasNext())                 ofLong = mapper.apply(ofT.next()).iterator();              return ofLong != null &amp;&amp; ofLong.hasNext();         }     }      return StreamSupport.longStream(             Spliterators.spliteratorUnknownSize(new OfLong(), 0),             false     ); }  @Override public DoubleStream flatMapToDouble(Function&lt;? super T, ? extends DoubleStream> mapper) {     Objects.requireNonNull(mapper);      class OfDouble implements PrimitiveIterator.OfDouble {         private final Iterator&lt;T> ofT = Streamer.this.iterator();          private PrimitiveIterator.OfDouble ofDouble;          @Override         public double nextDouble() {             if (!hasNext())                 throw new NoSuchElementException();              return ofDouble.next();         }          @Override         public boolean hasNext() {             while ((ofDouble == null || !ofDouble.hasNext()) &amp;&amp; ofT.hasNext())                 ofDouble = mapper.apply(ofT.next()).iterator();              return ofDouble != null &amp;&amp; ofDouble.hasNext();         }     }      return StreamSupport.doubleStream(             Spliterators.spliteratorUnknownSize(new OfDouble(), 0),             false     ); }<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b<\/h2>\n<p>\u0412\u0441\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u043e \u043e\u0431\u0449\u0435\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439: <\/p>\n<p>1 \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 (\u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u2014 \u00ab\u043d\u0435 null\u00bb)<\/p>\n<p>2 \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f &#8212; \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c WAITING, \u0435\u0441\u043b\u0438 \u0414\u0410, \u0442\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u0432 OPERATED, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0440\u043e\u0441\u0430\u0435\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/p>\n<p>3 \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430<\/p>\n<p>4 \u2014 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430. <\/p>\n<p>\u0428\u0430\u0431\u043b\u043e\u043d \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">public ... someTerminalMethod(... args) { Objects.requireNonNull(args); \/\/1 \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 throwIfNotWaitingOrSetOperated(); \/\/2 \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438    \/\/\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f try { ... \/\/3 - \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439... } finally { internalClose(); \/\/4 \u2014 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 } }<\/code><\/pre>\n<p>P.S., \u0442\u0430\u043a \u0436\u0435, \u0432\u043e \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u044f \u0437\u0430\u043c\u0435\u043d\u0438\u043b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u0441\u043e <code>Stream&lt;T><\/code> \u043d\u0430 <code>Streamer&lt;T><\/code> \u0442.\u043a. \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u043e\u0432 \u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u043c \u043a\u043e\u0434\u0435.<\/p>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/commit\/e4ecd5b517a148bb3f5103165e97f372571e27cb\" rel=\"noopener noreferrer nofollow\"><strong>diff<\/strong><\/a><\/p>\n<p>P.P.S. \u0442\u0430\u043a \u0436\u0435, \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u0435 \u044f \u043f\u043e\u043a\u0440\u044b\u043b \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b. \u041e\u0442\u0447\u0430\u0441\u0442\u0438, \u043b\u043e\u0433\u0438\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u043e \u044d\u0442\u0438\u043c \u0442\u0435\u0441\u0442\u0430\u043c.<\/p>\n<h2>\u0411\u0430\u0433\u0438<\/h2>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u044b\u043b\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0430\u0433\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a <code>ClassCastException<\/code>:<\/p>\n<pre><code class=\"java\">    Streamer&lt;String> streamer = Streamer.of(\"10\", \"5\", \"15\");     streamer.map(Integer::valueOf); \/\/CCE \u043d\u0435 \u0442\u0443\u0442...     streamer.forEach(System.out::println); \/\/\u2190 \u0430 \u0442\u0443\u0442!<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043a\u0430\u043a <code>Streamer&lt;String><\/code>, \u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 <code>map()<\/code> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043c\u0435\u043d\u0430 \u0442\u0438\u043f\u0430 \u043d\u0430 <code>Streamer&lt;Integer><\/code>. \u0412 <code>forEach()<\/code>, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <em>action<\/em> \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043a\u0430\u043a <em>Consumer&lt;? <\/em><strong><em>super <\/em><\/strong><em>T><\/em>. \u041d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435\u044f\u0432\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043a \u0442\u0438\u043f\u0443: <code>(String)streamerIterator.next()<\/code> \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>forEach()<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a CCE \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d <em>flatMap()<\/em> \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0432\u044f\u0437\u0430\u043d \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c, \u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0432 <em>OPERATED<\/em>. \u041f\u043e\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0440\u0438\u043c, \u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u043e\u0437\u0436\u0435. \u0414\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c:<\/p>\n<pre><code class=\"java\">return (Streamer&lt;R>) this;<\/code><\/pre>\n<p>\u043d\u0430<\/p>\n<pre><code class=\"java\">return (Streamer&lt;R>)Streamer.of(this);<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 (\u0441\u043b\u0438\u043d\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0439) \u043d\u0430 &#171;\u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e&#187;. \u041a\u0441\u0442\u0430\u0442\u0438, \u0432\u044b\u0437\u043e\u0432 <code>this.iterator()<\/code> \u0438 \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u0442 \u043d\u0430\u0448 \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u0432 <em>OPERATED<\/em> \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0436\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043c\u044b \u0443\u0436\u0435 \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u043b\u0438\u0441\u044c \u0440\u0430\u043d\u0435\u0435 \ud83d\ude42 \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0437\u043e\u0432 <code>forEach()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043c\u0435\u043d\u0438\u043b \u0441\u0432\u043e\u0439 \u0442\u0438\u043f \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u0432 <em>OPERATED<\/em> \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438. \u041d\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041c\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0438 CCE, \u0446\u0435\u043d\u043e\u0439 \u0440\u0430\u0437\u043c\u044b\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430. \u042d\u0442\u043e\u0442 \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0442\u0435\u043f\u0435\u0440\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u043e\u0439, \u043f\u043e\u0440\u0430\u0436\u0434\u0430\u044e\u0449\u0435\u0439 \u043d\u043e\u0432\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440, \u043d\u043e \u043d\u0435 \u0431\u0438\u043b\u0434\u0435\u0440\u043e\u043c, \u043a\u0430\u043a \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b. \u0427\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c, \u043e\u0431\u0434\u0443\u043c\u0430\u0435\u043c \u043f\u043e\u0437\u0436\u0435, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0440\u0443\u0433\u043e\u0439 \u0431\u0430\u0433\u2026  <\/p>\n<p>\u041a\u043e\u0434:<\/p>\n<pre><code class=\"java\">final AtomicInteger ai = new AtomicInteger(); Streamer.generate(ai::getAndIncrement).limit(10).forEach((v) -> System.out.print(v + \" \")); System.out.print(ai);<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u044b\u0434\u0430\u0435\u0442 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code>0 1 2 3 4 5 6 7 8 9 11<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u2014 \u00ab10\u00bb. \u041f\u043e\u0442\u0435\u0440\u044f \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u00ab10\u00bb \u0431\u044b\u043b\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e (\u0442.\u0435. \u0437\u0430\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c), \u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 LimitOperation, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0437\u0430 \u0446\u0438\u043a\u043b\u043e\u043c, \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e \u00ab11\u00bb. \u042f \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043b \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <em>LimitOperation<\/em> \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0440\u0438 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0438 \u043b\u0438\u043c\u0438\u0442\u0430, \u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u0434\u043e\u0448\u0435\u043b \u043a \u00ab\u0433\u0440\u0430\u043d\u0438\u0446\u0435\u00bb &#8212; \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u043b\u0438\u043c\u0438\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439, \u0430 \u043d\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u0417\u0430\u0442\u0435\u043c, \u0442\u0430\u043c, \u0433\u0434\u0435 \u0440\u0430\u043d\u044c\u0448\u0435 \u043e\u043d \u00ab\u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b\u0441\u044f\u00bb, \u0442\u0435\u043f\u0435\u0440\u044c \u0442\u0430\u043a\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0444\u043b\u0430\u0433\u0430 <code>noNext = true<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043f\u0435\u0440\u0435\u0434 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. <\/p>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/commit\/592cadb564cbbdcbc95da49c22d40cf7b774ecab\" rel=\"noopener noreferrer nofollow\"><strong>diff<\/strong><\/a><\/p>\n<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438<\/h2>\n<p>\u0427\u0438\u0441\u043b\u0430 \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438:<\/p>\n<pre><code class=\"java\">Streamer         .iterate(new int[]{0,1}, ints -> new int[]{ints[1],ints[0] + ints[1]})         .limit(10)         .mapToInt(ints -> ints[1])         .forEach(System.out::println); \/\/1, 1, 2, 3, 5, 8, 13, 21, 34, 55<\/code><\/pre>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u0435\u043d\u0441\u0438\u043e\u043d\u0435\u0440\u043e\u0432:<\/p>\n<pre><code class=\"java\">Streamer         .generate(PersonUtils::generateRandomPerson)         .filter(person ->                 (person.gender == Person.Gender.MALE &amp;&amp; person.age >= 63)                     ||                 (person.gender == Person.Gender.FEMALE &amp;&amp; person.age >= 58))         .limit(10)         .sorted(Comparator.comparing(Person::getGender).thenComparingInt(Person::getAge).reversed()) \/\/\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e \u043f\u043e\u043b\u0443, \u0437\u0430\u0442\u0435\u043c \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0443 (\u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f)         .forEach(System.out::println); \/\/\u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/code><\/pre>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0430\u0440\u043c\u0435\u0439\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u0437\u044b\u0432:<\/p>\n<pre><code class=\"java\">Streamer         .generate(PersonUtils::generateRandomPerson) \/\/\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u0435\u0440\u0441\u043e\u043d\u0443             .filter(person -> person.gender == Person.Gender.MALE) \/\/\u043e\u0442\u0431\u0435\u0440\u0435\u043c \u043f\u043e \u043f\u043e\u043b\u0443             .filter(person -> person.age >= 18 &amp;&amp; person.age &lt;= 27) \/\/\u043e\u0442\u0431\u0435\u0440\u0435\u043c \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0443             .limit(10) \/\/\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0431\u0440\u0430\u043b\u0438 10 \"\u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432\"             .sorted(Comparator.comparingInt(Person::getAge).thenComparing(Person::getName)) \/\/\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0443, \u0437\u0430\u0442\u0435\u043c \u043f\u043e \u0424\u0418\u041e         .forEach(System.out::println); \/\/\u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/code><\/pre>\n<h2>\u0413\u043e\u043d\u043a\u0438 \u0441\u0442\u0440\u0438\u043c\u043e\u0432<\/h2>\n<p>\u041d\u0443 \u0432\u043e\u0442 \u0438 \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f <s>\u043f\u0440\u043e\u0449\u0430\u0442\u044c\u0441\u044f<\/s> \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043b\u043e\u0442\u043d\u043e \u0435\u0433\u043e \u043f\u043e\u043a\u0440\u044b\u043b\u0438. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u2026 \u0418 \u0442\u0430\u043a, \u0443\u0441\u0442\u0440\u043e\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0433\u043e\u043d\u043a\u0438 \u0441\u0442\u0440\u0438\u043c\u043e\u0432&#8230; \u041d\u0430 \u0442\u0440\u0430\u0441\u0441\u0443 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0442\u0440\u0438 \u0431\u043e\u043b\u043b\u0438\u0434\u0430: \u21161 \u2014 JDK IntStream; \u21162 \u2014 JDK stream (\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b); \u21163 \u2014 Streamer; \u0417\u0430\u0434\u0430\u0447\u0430 \u2014 \u043f\u0440\u043e\u0435\u0445\u0430\u0442\u044c \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u044f\u043c\u0443\u044e \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044e, \u0434\u043b\u0438\u043d\u043e\u0439 \u0432 100000000 \u0448\u0430\u0433\u043e\u0432 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u043d\u0430 \u0444\u0438\u043d\u0438\u0448\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0437\u043c\u0435\u0440\u044f\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043e\u0435 \u043d\u0430 \u044d\u0442\u043e. \u0412\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>\u041a\u043e\u0434 \u0433\u043e\u043d\u043a\u0438:<\/p>\n<pre><code class=\"java\">public class SpeedRunner {     public static void main(String[] args) {         \/\/CASE #1 - IntStream.iterate         System.out.println(\"-----------------\\nCASE #1 - IntStream.iterate\");         printStreamTiming(IntStream.iterate(1, i -> i + 1));         \/\/CASE #2 - Stream.iterate         System.out.println(\"-----------------\\nCASE #2 - Stream.iterate\");         printStreamTiming(Stream.iterate(1, i -> i + 1));         \/\/CASE #3 - Streamer.iterate         System.out.println(\"-----------------\\nCASE #3 - Streamer.iterate\");         printStreamTiming(Streamer.iterate(1, i -> i + 1));     }      private static void printStreamTiming(Stream&lt;Integer> stream) {         long start = System.currentTimeMillis();         stream                 .filter(i -> i > 100000000)                 .limit(10)                 .forEach(i -> {});         long elapsed = System.currentTimeMillis() - start;         System.out.printf(\"Elapsed time: %dms (%s)\\n\", elapsed, new SimpleDateFormat(\"mm:ss.S\").format(new Date(elapsed)));     }      private static void printStreamTiming(IntStream stream) {         long start = System.currentTimeMillis();         stream                 .filter(i -> i > 100000000)                 .limit(10)                 .forEach(i -> {});         long elapsed = System.currentTimeMillis() - start;         System.out.printf(\"Elapsed time: %dms (%s)\\n\", elapsed, new SimpleDateFormat(\"mm:ss.S\").format(new Date(elapsed)));     } }<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0433\u043e\u043d\u043a\u0438:<\/p>\n<pre><code>----------------- CASE #1 - IntStream.iterate Elapsed time: 58ms (00:00.58) ----------------- CASE #2 - Stream.iterate Elapsed time: 582ms (00:00.582) ----------------- CASE #3 - Streamer.iterate Elapsed time: 7662ms (00:07.662)<\/code><\/pre>\n<p>\u0424\u0430\u0432\u043e\u0440\u0438\u0442\u043e\u043c \u0433\u043e\u043d\u043a\u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f IntStream \u0438\u0437 JDK \u2014 58ms, \u043f\u0440\u043e\u0442\u0438\u0432 582ms \u0443 \u043f\u0440\u0438\u0431\u044b\u0432\u0448\u0435\u0433\u043e \u0432\u0442\u043e\u0440\u044b\u043c JDK Stream. \u0420\u0430\u0437\u043b\u0438\u0447\u0438\u0435 \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 10 \u0440\u0430\u0437! \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u0432 \u0441\u0442\u0440\u0438\u043c\u0430\u0445, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c IntStream, \u0432\u043c\u0435\u0441\u0442\u043e Stream&lt;Integer>. \u0421\u0442\u0440\u0438\u043c\u0435\u0440 \u0436\u0435 \u043f\u0440\u0438\u0431\u044b\u043b \u043a \u0444\u0438\u043d\u0438\u0448\u0443 \u0442\u0440\u0435\u0442\u0438\u043c, \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c 7662ms, \u0447\u0442\u043e \u0432 13 \u0440\u0430\u0437 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0430 \u0438\u0437 JDK \u0438 \u0432 ~130 \u0440\u0430\u0437 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 JDK IntStream`a.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439, \u043d\u043e \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043e\u0434\u043d\u0438\u043c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435\u043c \u0440\u0443\u043a\u0438, \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 <strong>\u0441\u0435\u043c\u044c<\/strong> \u0440\u0430\u0437 (1156ms). \u0421\u0434\u0435\u043b\u0430\u043b \u044f \u044d\u0442\u043e, \u0437\u0430\u043c\u0435\u043d\u0438\u0432 <code>return this;<\/code> \u043d\u0430 <code>return Streamer.of(this);<\/code> \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <em>filter()<\/em>. \u0422.\u0435., \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u044b\u0433\u043e\u0434\u043d\u0435\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0435\u0440 \u043d\u0435 \u0438\u0437 \u043d\u0430\u0431\u043e\u0440\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0430 \u043a\u043e\u043d\u0432\u0435\u0435\u0440 \u0438\u0437 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0434\u043d\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u0441\u0430\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0446\u0435\u043f\u044c\u044e, \u0442\u0430\u043a \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0435\u0435 \u0437\u0432\u0435\u043d\u043e\u043c. <\/p>\n<p>\u042f \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u043e\u0442\u043a\u0443\u0434\u0430 \u0442\u0430\u043a\u0430\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430, \u043f\u043e \u043c\u043e\u0438\u043c \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043c\u0435\u0434\u043b\u044f\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c (\u0438 \u0442\u043e \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0437\u0430\u043c\u0435\u0442\u043d\u043e), \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0447\u0435\u043c \u0446\u0435\u043f\u043d\u043e\u0439 \u0432\u044b\u0437\u043e\u0432 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 (\u043f\u043e \u0441\u0443\u0442\u0438, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u043e\u0434\u043d\u043e\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c). \u041d\u043e \u044d\u0442\u043e \u043b\u0438\u0448\u044c \u0442\u0435\u043e\u0440\u0438\u044f, \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435.<\/p>\n<h2>Builder \u2192 Factory<\/h2>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043e\u0433\u043e \u0444\u0438\u043a\u0441\u0430 &#8212; <code>return this;<\/code> \u043d\u0430 <code>return Streamer.of(this);<\/code> \u0432\u043e \u0432\u0441\u0435\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044e \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430, \u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a \u0441\u043c\u0435\u043d\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 \u0435\u0433\u043e \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0412 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u0431\u0438\u043b\u0434\u0435\u0440\u0430 &#8212; \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0435\u0431\u044f. \u0414\u0430\u043d\u043d\u0430\u044f \u0437\u0430\u043c\u0435\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u0442 \u044d\u0442\u043e \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c. JDK \u0441\u0442\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c (\u0444\u0430\u0431\u0440\u0438\u043a\u043e\u0439). \u042f \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u043d\u0430 \u00ab\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u043c\u00bb \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0432\u0441\u0435 \u043f\u043e \u00ab\u0443\u043c\u0443\u00bb, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0442\u0430\u043a \u0436\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 <em>List&lt;IntermediateOperation><\/em>, \u0430 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430. <\/p>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u0438\u0434\u0442\u0438 \u0435\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c, \u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441 \u0442\u0430\u043a\u043e\u0439 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432: <\/p>\n<p> <em>xxxStreamerOperation<\/em> \u2192 <em>AbstractStreamerOperation<\/em> \u2192  <em>AbstractStreamer<\/em> \u2192 <em>Stream<\/em>\u2026<\/p>\n<h2>Optional \u0438 null`\u044b<\/h2>\n<p>JDK Stream \u0438\u043c\u0435\u0435\u0442 \u0442\u0430\u043a\u0443\u044e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"java\">\/\/NullPointerException \u0438\u0437\u0437\u0430 Optional: Stream.of(null, 1, 2, 3).findFirst(); Stream.of(null, 1, 2, 3).findAny(); Stream.of(1, null, 2, 3).min(Comparator.nullsFirst(Integer::compareTo)); Stream.of(1, null, 2, 3).max(Comparator.nullsLast(Integer::compareTo)); Stream.of(1, null, 2, 3).reduce((total, curr) -> { Integer t = total + (curr == null ? 0 : curr); return (t == 6 ? null : t); });<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c NPE \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <em>Optional<\/em> \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b. \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f \u0432\u0435\u0449\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u043a\u043e\u0442\u043e\u0440\u044b\u0445  <code>Optional&lt;><\/code>: <code>findAny(), findFirst(), min(), max(), reduce()<\/code><\/p>\n<h2>\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0440\u0435\u0448\u0438\u043b \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b\/\u043f\u043e\u043b\u044f\/\u043a\u043b\u0430\u0441\u0441\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440  <code>of<\/code> \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439(\u044f). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0435\u0442\u043e\u0434\u044b, \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0430 \u043d\u0435 \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u044f \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043b \u0438\u0437 <code>of()<\/code> \u0432 <code>from(): from(Iterable&lt;T>); from(Iterator&lt;T>);<\/code><\/p>\n<p>\u0422\u0430\u043a \u0436\u0435, \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0438\u0437 \u043c\u044d\u043f\u044b: <\/p>\n<p><code>from(Map&lt;K,V>)<\/code> &#8212; <code>Streamer&lt;Map.Entry&lt;K,V>><\/code> (\u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u044d\u043f\u044b) <code>fromMapKeys(Map&lt;K,V>) - Streamer&lt;K><\/code> (\u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043a\u043b\u044e\u0447\u0435\u0439 \u043c\u044d\u043f\u044b) <code>fromMapValues(Map&lt;K,V>) - Streamer&lt;V><\/code> (\u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043c\u044d\u043f\u044b)<\/p>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/commit\/aad74be8c8cf3f5bb953f794f3c092b2c5f70720\" rel=\"noopener noreferrer nofollow\"><strong>\u041a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u043c \ud83d\ude42<\/strong><\/a><\/p>\n<p>\u0414\u043b\u044f \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u043f\u0443\u0442\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0442\u0430\u043a \u0436\u0435 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043b: externalIterator \u2192 sourceIterator; StreamerIterator \u2192 InternalStreamerIterator, <s>\u043c\u0438\u043b\u0438\u0446\u0438\u044f \u2192 \u043f\u043e\u043b\u0438\u0446\u0438\u044f, \u043c\u0435\u0434\u0438\u043a\u0438 \u2192 \u043c\u0435\u0434\u0432\u0435\u0434\u0438\u043a\u0438<\/s><\/p>\n<h2>\u0412\u0438\u0448\u0435\u043d\u043a\u0430 \u0431\u0435\u0437 \u0442\u043e\u0440\u0442\u0438\u043a\u0430 \ud83d\ude42<\/h2>\n<p>\u0415\u0441\u043b\u0438 flatMap() \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u0438\u043c\u0430 \u043d\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0438\u0445. \u0412\u0441\u0442\u0440\u0435\u0447\u0430\u0439\u0442\u0435:<\/p>\n<pre><code class=\"java\">public &lt;K> Map&lt;K,Collection&lt;T>> groupBy(Function&lt;? super T,? extends K> groupMapper) {     return collect(HashMap::new,             (map, object) -> map.merge(                     groupMapper.apply(object),                     new ArrayList&lt;>(Collections.singletonList(object)),                     ((left, right) -> {                         left.addAll(right);                         return left;                     }) ),             null); }<\/code><\/pre>\n<p>\u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 Map, \u0433\u0434\u0435 \u043a\u043b\u044e\u0447 (&lt;K>) \u044d\u0442\u043e \u0433\u0440\u0443\u043f\u043f\u0430, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (&lt;V>) \u044d\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u044d\u0442\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b. <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435:<\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0435\u0441\u0442\u044c <code>Streamer&lt;Number><\/code> \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u044b \u0447\u0438\u0441\u0435\u043b (Number): <em>Integer<\/em>, <em>Long<\/em>, <em>Double<\/em>, <em>Float<\/em>. \u0421\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u043e \u0438\u0445 \u0442\u0438\u043f\u0443 (\u043a\u043b\u0430\u0441\u0441\u0443), \u0437\u0430\u0442\u0435\u043c \u00ab\u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u043e\u00bb \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"java\">\/\/\u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 Streamer&lt;Number> streamer = Streamer.of(1, 4L, 6.5d, 18.1f, 8, 15L, 16.111125d, 218.12f, 41, 45L, 1116.5d, 222.3f); \/\/\u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u043c \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0443 Map&lt;Class, Collection&lt;Number>> groupedByClasses = streamer.groupBy(Number::getClass); \/\/\u043e\u0444\u043e\u0440\u043c\u0438\u043c \u0432\u044b\u0432\u043e\u0434 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 for (Class numberClass : groupedByClasses.keySet()) {   System.out.println(numberClass.getSimpleName() + \":\");   for (Number number : groupedByClasses.get(numberClass))     System.out.println(\"\\t\" + number); }<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code>Long: 4 15 45 Double: 6.5 16.111125 1116.5 Float: 18.1 218.12 222.3 Integer: 1 8 41  Process finished with exit code 0<\/code><\/pre>\n<p>\u0418\u043b\u0438 \u043f\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0443 &#8212; \u0447\u0435\u0442\u043d\u043e\u0435\/\u043d\u0435\u0447\u0435\u0442\u043d\u043e\u0435:<\/p>\n<pre><code class=\"java\">Map&lt;Boolean, Collection&lt;Number>> groupedByParity = streamer.groupBy(number -> (number.intValue() &amp; 1) == 0); \/\/\u0432\u0435\u0440\u043d\u0435\u0442 Boolean.TRUE \u0434\u043b\u044f \u0447\u0435\u0442\u043d\u043e\u0433\u043e \u0438 Boolean.FALSE \u0434\u043b\u044f \u041d\u0415 \u0447\u0435\u0442\u043d\u043e\u0433\u043e number, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0438 \u00ab\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u043c\u00bb System.out.println(\"\u0427\u0435\u0442\u043d\u044b\u0435: \" + groupedByParity.get(true)); System.out.println(\"\u041d\u0435\u0447\u0435\u0442\u043d\u044b\u0435: \" + groupedByParity.get(false));<\/code><\/pre>\n<h2>\u041f.\u0421.\u044b.<\/h2>\n<p>\u0418\u0437\u043c\u0435\u043d\u0438\u043b \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 <em>from(Iterable)<\/em> &#8212; \u043d\u0430 \u00ab\u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u00bb. \u0422\u0435\u043f\u0435\u0440\u044c, \u043f\u0440\u0438 \u043f\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u044d\u0442\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u0432 \u0440\u0430\u0431\u043e\u0442\u0443. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430, \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c <code>ConcurrentModificationException<\/code>.<\/p>\n<h2>\u0424\u0438\u043d\u0430\u043b<\/h2>\n<p>\u041f\u043e \u043c\u0435\u0440\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0443 \u043c\u0435\u043d\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u044d\u0442\u0443 \u0440\u0430\u0431\u043e\u0442\u0443, \u044f \u0431\u0443\u0434\u0443 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0438 \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0438\u0434\u0435\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u0434\u0435, \u043f\u0440\u043e\u0448\u0443 \u0438\u0445 pull-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u0438\u0442\u044c :), \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0438 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438\u0434\u0435\u0438, \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f, \u043e\u0441\u043a\u043e\u0440\u0431\u043b\u0435\u043d\u0438\u044f, \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u044b\u0435 \u043c\u043d\u043e\u044e \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u0442.\u0434. , \u043f\u0440\u043e\u0448\u0443 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u044b. \ud83d\ude42 \u041f.\u041f.\u0421. \u0442\u0435\u043a\u0441\u0442 \u043f\u043e \u0445\u043e\u0434\u0443 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u0442.\u043a. \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0431\u044b\u043b\u0438 \u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u0438\u0434\u0435\u0438, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0442\u0443\u0442, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b.<\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/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\/573252\/\"> https:\/\/habr.com\/ru\/articles\/573252\/<\/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<p>\u041f\u0440\u0438\u0432\u0435\u0442 all!<\/p>\n<h2>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041f\u0440\u0438\u0433\u043b\u044f\u043d\u0443\u043b\u0430\u0441\u044c \u043c\u043d\u0435 \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u0438\u0434\u0435\u044f \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u043d\u0433\u0430 (\u0440\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438) StreamAPI \u0438\u0437 JDK8. \u0427\u0442\u043e \u0438 \u043a\u0430\u043a \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u043e \u043e\u043f\u0438\u0448\u0443 \u0434\u0430\u043b\u0435\u0435.<\/p>\n<h2>\u0421\u0441\u044b\u043b\u043a\u0438<\/h2>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\" rel=\"noopener noreferrer nofollow\">\u0410\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/tree\/habr_pub1\" rel=\"noopener noreferrer nofollow\">\u0412\u0435\u0442\u043a\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438<\/a><\/p>\n<h2>\u0412\u043a\u0440\u0430\u0442\u0446\u0435<\/h2>\n<p>StreamAPI \u2014 \u044d\u0442\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0430\u044f\u0441\u044f \u0432 Java 8 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u043d\u0430\u0431\u043e\u0440\u0430\u0445 (\u043d\u0430\u043f\u0440. \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c\u0438) \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435 (\u043b\u044f\u043c\u0431\u0434\u0430-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438). \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e \u0441\u0442\u0440\u0438\u043c\u044b <a href=\"https:\/\/habr.com\/ru\/company\/luxoft\/blog\/270383\/\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0443\u0442<\/a>.<\/p>\n<h2>\u0417\u0430\u0447\u0435\u043c \u0438 \u0434\u043b\u044f \u0447\u0435\u0433\u043e<\/h2>\n<p>\u0414\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0439 \u0442\u0435\u043c\u044b. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u043d\u0435\u043c\u0430\u043b\u043e \u043e\u043f\u044b\u0442\u0430, \u043a\u0430\u043a \u043f\u043e \u0441\u0442\u0440\u0438\u043c\u0430\u043c, \u0442\u0430\u043a \u0438 \u0432 \u0446\u0435\u043b\u043e\u043c \u043f\u043e Java \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u0430 \u0440\u0435\u0432\u0435\u0440\u0441\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439. \u042f \u0431\u044b \u043f\u043e\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043b \u0438 \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c \u0438 \u0442\u0435\u043c \u043a\u0442\u043e \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u043f\u043e\u0432\u044b\u0448\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0442\u0440\u0438\u043c\u0430. \u0418 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0432\u0430\u0448\u0435\u0433\u043e \u043e\u043f\u044b\u0442\u0430, \u0432\u0430\u0441 \u0436\u0434\u0443\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \ud83d\ude42<\/p>\n<h2>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <strong><em>Stream Reversed \u2192 StreamRe \u2192 StreamEr \u2192 Streamer<\/em><\/strong><\/p>\n<h2>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438\/\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438<\/h2>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u043d\u0433, \u0446\u0435\u043b\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435, \u0442\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u043e\u0442 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u044f Enterprise. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0440\u0438\u043c\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u0443\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0443 \u0438\u0437 JDK \u043f\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e.<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0438\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u044b\u043b\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0438\u043c\u043e\u0432 (Parallel stream), \u0442.\u043a. \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u043d\u044b\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430.<\/p>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0442\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 StreamAPI:<\/p>\n<ul>\n<li>\n<p>\u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0422.\u0435., \u043f\u043e\u043a\u0430 \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0442\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u043c \u043d\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435 \u0447\u0438\u0442\u0430\u0435\u043c \u0435\u0433\u043e, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0431\u043e\u0440 \u043f\u0440\u0430\u0432\u0438\u043b, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0435\u0440 \u0441\u0442\u0440\u0438\u043c\u0430 \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0432 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0438 \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043d\u0435 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044f\u0441\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u0445, \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0438 \u0442.\u0434. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<\/ul>\n<h2>Spliterator vs. Iterator<\/h2>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b Stream \u043c\u043e\u0433 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0435\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f JDK (\u0434\u0430\u043b\u0435\u0435 \u00ab\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u00bb), \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c, \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043f\u043b\u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 &#8212; <code>Spliterator&lt;T><\/code>.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043f\u043b\u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u2014 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0431\u043b\u043e\u043a\u0438, \u0442.\u0435. \u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445. \u041f\u043e\u0440\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u00ab\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u043e\u043c\u00bb \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0438\u043c\u043e\u0432, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u0440\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e, \u043e \u0441\u043f\u043b\u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u0445 <a href=\"https:\/\/habr.com\/ru\/post\/256905\/\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0443\u0442<\/a>. <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c parallel \u0434\u043b\u044f \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430, \u0442\u043e \u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0431\u043b\u043e\u043a\u0438 \u0442\u043e\u0436\u0435 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0445\u0432\u0430\u0442\u0438\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440a &#8212; <code>Iterator&lt;T><\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u00ab\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u00bb \u0438\u043c\u0435\u043d\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430.<\/p>\n<h2> \u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b (\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f)<\/h2>\n<p> \u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b \u043d\u0430 \u0442\u0440\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>     <em>\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435     (WAITING)<\/em>     \u2014 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430. \u0412 \u044d\u0442\u043e\u043c     \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f. \u041f\u043e\u043a\u0430 \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u043c\u044b     \u043c\u043e\u0436\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432     \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u00ab\u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u00bb.<\/p>\n<\/li>\n<li>\n<p>     <em>\u0412     \u0440\u0430\u0431\u043e\u0442\u0435 (OPERATED) \u2014 <\/em>\u0432     \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435     \u0432\u044b\u0437\u043e\u0432\u0430 \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430. \u042d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043b\u0438\u0431\u043e \u0441\u0442\u0440\u0438\u043c\u0435\u0440     \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u2014 \u00ab\u043a\u043e\u043d\u0432\u0435\u0435\u0440 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u00bb, \u043b\u0438\u0431\u043e \u0433\u043e\u0442\u043e\u0432 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443, \u0442.\u0435. \u0443\u0436\u0435 \u0441\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u044b\u0437\u043e\u0432\u044b \u043a\u0430\u043a \u043a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u044b\u0445 \u0442\u0430\u043a \u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0431\u043e\u043b\u0435\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b.<\/p>\n<\/li>\n<li>\n<p>     <em>\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d     (CLOSED) \u2014 <\/em>\u042d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b     \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b, \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043e\u0431\u043d\u0443\u043b\u0435\u043d\u0430 (RefCount \u0434\u043b\u044f GC).<em> <\/em>\u0412 \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a:      <\/p>\n<ul>\n<li>\n<p>         \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430 \u043b\u044e\u0431\u043e\u0433\u043e \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>findFirst()<\/code> \u0432\u0435\u0440\u043d\u0443\u043b \u00ab\u043f\u0435\u0440\u0432\u044b\u0439\u00bb \u044d\u043b\u0435\u043c\u0435\u043d\u0442.         \u0414\u0430\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0435\u0449\u0435 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c, \u043d\u043e \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441\u0432\u043e\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>         \u0412         \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0435 &#8212; <code>hasNext()<\/code>         \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u0441\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441 <code>true<\/code> \u043d\u0430 <code>false<\/code>.<\/p>\n<\/li>\n<li>\n<p>         \u0418\u0437\u0432\u043d\u0435, \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d \u043c\u0435\u0442\u043e\u0434 \u044f\u0432\u043d\u043e\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u2014         close()         \u0438         \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0442\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f \u0432 WAITING         \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438.         \u0414\u0430\u043d\u043d\u043e\u0435         \u0443\u0441\u043b\u043e\u0432\u0438\u0435 (WAITING) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c,         \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443         \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0441\u0442\u0440\u0438\u043c. \u0422\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u00ab\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u00bb,  \u0434\u0430\u043b\u0435\u0435 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h2>\n<p> \u0420\u0430\u0437\u0434\u0435\u043b\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u0441\u0442\u0440\u0438\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0442\u0440\u0438 \u0433\u0440\u0443\u043f\u043f\u044b:<\/p>\n<p>    <u>\u041f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0435 (factory)<\/u>:<em> <\/em><code>empty, of, generate, iterate<\/code><\/p>\n<p><em>    <\/em><u>\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435(intermediate)\/\u043a\u043e\u043d\u0432\u0435\u0435\u0440\u043d\u044b\u0435<\/u>: <code>peek, onClose, distinct, filter, skip, limit, sorted, map, mapToInt, mapToLong, mapToDouble, flatMap, flatMapToInt, flatMapToLong, flatMapToDouble<\/code><\/p>\n<p>    <u>\u0417\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0438\u0435 (terminal)<\/u>: <code>spliterator, unordered, forEachOrdered, collect, min, max, reduce, count, forEach, allMatch, anyMatch, noneMatch, findFirst, findAny, iterator, toArray<\/code><\/p>\n<p>    <u>\u041f\u0440\u043e\u0447\u0438\u0435<\/u>: <code>close, isParallel, sequential<\/code><\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u043c <code>Streamer&lt;T><\/code>, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>java.util.stream.Stream&lt;T><\/code>. \u041f\u043e\u0437\u0432\u043e\u043b\u0438\u043c IDE \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432\u0441\u0435\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0437\u0430\u0433\u043b\u0443\u0448\u0438\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>UnsupportedOperationException<\/code>.<\/p>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/blob\/a79ed1df4382b3acf9b57e14568f1d94018ae99b\/src\/main\/java\/pw\/komarov\/streamer\/Streamer.java\" rel=\"noopener noreferrer nofollow\"><strong>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a<\/strong><\/a>.<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435, \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 &#8212; \u00ab\u043e\u0434\u043d\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u0438\u043a\u043e\u0432\u00bb, \u0447\u0442\u043e\u0431\u044b \u0431\u043e\u043b\u0435\u0435 \u043a \u043d\u0438\u043c \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f:<\/p>\n<pre><code class=\"java\">@Override public Optional&lt;T> findFirst() {     return findAny(); \/\/\u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0441 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0440\u0438\u043c,                        \/\/\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 (First)    \/\/\u0438 \u0435\u0441\u0442\u044c \"\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439\" (Any) }  @Override public boolean isParallel() {     return false; \/\/\u043c\u044b \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435\u0433\u0434\u0430 false }  @Override public Stream&lt;T> sequential() {     return this; \/\/\u043c\u044b \"\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\", \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0440\u043d\u0435\u043c \u0441\u0435\u0431\u044f \u0436\u0435 }  @Override public void forEachOrdered(Consumer&lt;? super T> action) {     forEach(action); \/\/\u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u043c\u044b \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c,     \/\/\u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435     \/\/forEach \u0438 forEachOrdered \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b }  @Override public Spliterator&lt;T> spliterator() {     return Spliterators.spliteratorUnknownSize(this.iterator(),              Spliterator.ORDERED); \/\/\u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043f\u043b\u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440     \/\/\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u00ab\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e\u00bb \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 }  @Override public Stream&lt;T> unordered() {     return this; \/\/\u0442\u0430\u043a \u0436\u0435, \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0435\u0431\u044f }<\/code><\/pre>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432<\/h2>\n<p>\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c, \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u044b\u043c \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u043c (private) \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a. \u042d\u0442\u043e\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u043b\u0438\u0435\u043d\u0442\u044b \u0436\u0435, \u043a\u0430\u043a \u0438 \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0435, \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0437 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u0430\u0431\u0440\u0438\u043a. \u0421\u0442\u043e\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u043a \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0444\u0430\u0431\u0440\u0438\u043a\u0435 of() \u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0445 (Iterable) \u0442\u0438\u043f\u043e\u0432, \u0438 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u0437 \u0441\u0430\u043c\u0438\u0445 Iterator`\u043e\u0432.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430:<\/p>\n<pre><code class=\"java\">package pw.komarov.streamer;  import java.util.Arrays; import java.util.List; import java.util.concurrent.ThreadLocalRandom;  public class StreamerInstancesCreationExamples {     public static void main(String[] args) {         Streamer.empty(); \/\/\u043f\u0443\u0441\u0442\u043e\u0439          Streamer.of(new Object()); \/\/\u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442         Streamer.of(new Integer[]{1, 4, 8, 17}); \/\/\u043c\u0430\u0441\u0441\u0438\u0432         Streamer.of(Arrays.asList(7.34, 9, 18.7, 3)); \/\/Iterable (List)         Streamer.of(\"Foo\", \"Bar\", \"Juice\", \"hello\", \"streamer\"); \/\/\u0438\u0437 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442          \/\/Infinite         Streamer.generate(() -> ThreadLocalRandom.current().nextInt()); \/\/\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 (\u0440\u044d\u043d\u0434\u043e\u043c-\u0447\u0438\u0441\u043b\u043e)         Streamer.generate(() ->             {                 List strings = Arrays.asList(\"randomly\", \"returned\", \"string\", \"value\");                 return strings.get(ThreadLocalRandom.current().nextInt(strings.size()));             }); \/\/\u0440\u044d\u043d\u0434\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435          Streamer.iterate(100, (i) -> i * 2); \/\/\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c {100,200,400.........n}     } }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434\u044b <code>generate()<\/code> \u0438 <code>iterate()<\/code> \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0441\u0442\u0440\u0438\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e <code>hasNext()<\/code> \u0432\u0441\u0435\u0433\u0434\u0430 <code>== true<\/code> \u0438 \u00ab\u0437\u0430\u0433\u043b\u0443\u0448\u0435\u043d\u00bb \u043c\u0435\u0442\u043e\u0434 <code>forEachRemaining()<\/code>:<\/p>\n<pre><code class=\"java\">private static abstract class AbstractInfiniteIterator&lt;E>   implements Iterator&lt;E> {     @Override     public boolean hasNext() {         return true;     }      @Override     public void forEachRemaining(Consumer&lt;? super E> consumer) {         throw new UnsupportedOperationException();     } }<\/code><\/pre>\n<p> \u0418\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f <code>generate()<\/code>:<\/p>\n<pre><code class=\"java\">private static class InfiniteGenerator&lt;E>  extends AbstractInfiniteIterator&lt;E> {              private final Supplier&lt;E> supplier;          InfiniteGenerator(Supplier&lt;E> supplier) {         this.supplier = supplier;     }      @Override     public E next() {         return supplier.get();     } }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u044d\u0442\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0438 \u0437\u0430\u0442\u0435\u043c \u0438\u0437 \u043d\u0435\u0433\u043e \u0441\u0442\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"java\">public static &lt;E> Streamer&lt;E> generate(Supplier&lt;E> supplier) {     return of(new InfiniteGenerator&lt;>(supplier)); }<\/code><\/pre>\n<p>\u041f\u043e\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0438 <code>iterate()<\/code>:<\/p>\n<pre><code class=\"java\">public static class InfiniteIterator&lt;E>  extends AbstractInfiniteIterator&lt;E> {                    private E value; \/\/\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0448\u0430\u0433\u0430,     \/\/\u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u2014 initial      private final UnaryOperator&lt;E> unaryOperator; \/\/\u043a\u043b\u0438\u0435\u043d\u0441\u0442\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f      \/\/\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f      InfiniteIterator(E initial, UnaryOperator&lt;E> unaryOperator) {         this.value = initial;         this.unaryOperator = unaryOperator;     }      @Override     public E next() {         E prev = this.value;         this.value = unaryOperator.apply(prev);         return prev;     } }  public static &lt;E> Streamer&lt;E> iterate(E initial,                                        UnaryOperator&lt;E> unaryOperator) {        return of(new InfiniteIterator&lt;>(initial, unaryOperator)); } <\/code><\/pre>\n<p><a href=\"https:\/\/github.com\/koma1\/Streamer\/commit\/0831da78588e0b708f041ae12de3f801d145c20e#diff-7bf61ce18fd9d34a6f75fa6fb81be52d7ad1423beff0d551ca7fbdb1a3e1e450\" rel=\"noopener noreferrer nofollow\"><strong>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a<\/strong><\/a>.<\/p>\n<h2>\u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435\/\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041e\u043f\u0438\u0448\u0435\u043c \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\/\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430. \u041f\u0435\u0440\u0432\u044b\u0439 &#8212; <code>internalClose()<\/code> \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\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-390056","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/390056","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=390056"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/390056\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=390056"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=390056"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=390056"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}