{"id":322011,"date":"2021-04-24T15:00:09","date_gmt":"2021-04-24T15:00:09","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=322011"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=322011","title":{"rendered":"API, \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0441 Java 8. \u0427\u0430\u0441\u0442\u044c 3"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<p>\u041a\u0430\u043a\u0438\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 Java? \u041a\u0442\u043e-\u0442\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0438\u0437-\u0437\u0430 \u043d\u043e\u0432\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u0440\u043e\u0434\u0435 <a href=\"https:\/\/openjdk.java.net\/jeps\/361\" rel=\"nofollow noopener noreferrer\"><code>\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 switch<\/code><\/a>, <a href=\"https:\/\/openjdk.java.net\/jeps\/378\" rel=\"nofollow noopener noreferrer\">\u0431\u043b\u043e\u043a\u043e\u0432 \u0442\u0435\u043a\u0441\u0442\u0430<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/openjdk.java.net\/jeps\/395\" rel=\"nofollow noopener noreferrer\">\u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/a>. \u041a\u043e\u043c\u0443-\u0442\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0440\u043e\u0434\u0435 <a href=\"https:\/\/openjdk.java.net\/jeps\/261\" rel=\"nofollow noopener noreferrer\">\u043c\u043e\u0434\u0443\u043b\u0435\u0439<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/openjdk.java.net\/jeps\/379\" rel=\"nofollow noopener noreferrer\">\u043d\u0438\u0437\u043a\u043e\u043f\u0430\u0443\u0437\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u0432 \u043c\u0443\u0441\u043e\u0440\u0430<\/a>. \u041a\u0442\u043e-\u0442\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0432 \u0432\u0435\u0440\u0441\u0438\u044e Java, \u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 <a href=\"https:\/\/openjdk.java.net\/jeps\/341\" rel=\"nofollow noopener noreferrer\">\u0441\u0442\u0430\u043d\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435<\/a> \u0438 \u0431\u0443\u0434\u0435\u0442 <a href=\"https:\/\/openjdk.java.net\/jeps\/254\" rel=\"nofollow noopener noreferrer\">\u0435\u0441\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438<\/a>. \u041d\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0430, \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0432\u0430\u0436\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430. \u042d\u0442\u043e \u043d\u043e\u0432\u044b\u0435 API, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u043a\u043e\u0434\u0430 \u0438 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0442\u0440\u0430\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a \u043d\u0443\u0436\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445. \u0410 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0441\u0434\u0435\u043b\u0430\u044e\u0442 \u0432\u0430\u0448 \u043a\u043e\u0434 \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043f\u043e 10 \u043d\u043e\u0432\u044b\u0445 API, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432 Java 9 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 (<a href=\"https:\/\/habr.com\/ru\/post\/485750\/\">\u0447\u0430\u0441\u0442\u044c 1<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/487636\/\">\u0447\u0430\u0441\u0442\u044c 2<\/a>). \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0451 10.<\/p>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<h3>1. <code>Stream.toList()<\/code><\/h3>\n<p>  <\/p>\n<h4>\u041f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432: <a href=\"https:\/\/habr.com\/ru\/post\/547364\/\">Java 16<\/a><\/h4>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043a\u0430\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>Stream<\/code> \u0432 Java? \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u043e\u0432: \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439. \u0422\u0430\u043a\u043e\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0432\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u0438\u0434\u0435\u043b\u0438 \u0432 \u0441\u0432\u043e\u0451\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">List&lt;T&gt; targetList = sourceList         .stream()         \/\/ \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438         .collect(Collectors.toList());<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435\u043b\u044c\u0437\u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e <code>collect(Collectors.toList())<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0443\u0436 \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439, \u043d\u043e \u0432\u0441\u0451 \u0436\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u043c\u0435\u043d\u044c\u0448\u0435 \u043a\u043e\u0434\u0430. \u0418 \u0432 Java 16 \u044d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/16\/docs\/api\/java.base\/java\/util\/stream\/Stream.html#toList()\" rel=\"nofollow noopener noreferrer\"><code>Stream.toList()<\/code><\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">List&lt;T&gt; targetList = sourceList         .stream()         \/\/ \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438         .toList();<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u043b\u0438 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 <code>toList()<\/code> \u0438 <code>collect(Collectors.toList())<\/code>? \u041e\u0431\u0430 \u043b\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0432\u0435\u0434\u0443\u0442 \u0441\u0435\u0431\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e? \u0421 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0435\u0442: \u0435\u0441\u043b\u0438 <code>toList()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0442\u043e <code>collect(Collectors.toList())<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u043e\u043d \u0438\u043b\u0438 \u043d\u0435\u0442. \u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0438\u0433\u0434\u0435 \u0432 \u043a\u043e\u0434\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043d\u0435\u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0432\u0430\u043c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 (\u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0432\u044b \u0438\u0437 \u0442\u0430\u043a\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043b\u044e\u0434\u0435\u0439), \u0442\u043e \u0441\u043c\u0435\u043b\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c <code>collect(Collectors.toList())<\/code> \u043d\u0430 <code>toList()<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e <code>Stream.toList()<\/code> \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u0434 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0440\u043e\u0447\u0435, \u043d\u043e \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435! \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e <code>Stream.toList()<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f <code>Stream.toArray()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u043e\u0447\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0435\u0441\u043b\u0438 <code>Spliterator<\/code> \u0438\u043c\u0435\u0435\u0442 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0443 <code>SIZED<\/code>. \u0412 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a <code>Collectors.toList()<\/code> \u043d\u0438\u043a\u0430\u043a \u044d\u0442\u0443 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0443 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0441 \u043f\u0443\u0441\u0442\u043e\u0433\u043e <code>ArrayList<\/code>, \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044f \u0432 \u043d\u0451\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439: \u0437\u0430\u043c\u0435\u0440\u0438\u043c, \u043a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u043e\u043f\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430, \u0442.\u0435. \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0422\u0430\u043a \u043a\u0430\u043a \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f <code>Stream<\/code> \u043f\u043e \u0438\u0434\u0435\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0432 <code>new ArrayList&lt;&gt;(sourceList)<\/code> \u0438\u043b\u0438 <code>List.copyOf(sourceList)<\/code>, \u0442\u043e \u0437\u0430\u043c\u0435\u0440\u0438\u043c \u0438 \u044d\u0442\u0438 \u0434\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u044f \u0442\u043e\u0436\u0435:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 JMH-\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">import org.openjdk.jmh.annotations.*;  import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.IntStream;  @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) @State(Scope.Thread) public class ToList {      @Param({&quot;10&quot;, &quot;100&quot;, &quot;1000&quot;})     private int size;      private List&lt;Integer&gt; sourceList;      @Setup     public void setup() {         sourceList = IntStream                 .range(0, size)                 .boxed()                 .collect(Collectors.toList());     }      @Benchmark     public List&lt;Integer&gt; newArrayList() {         return new ArrayList&lt;&gt;(sourceList);     }      @Benchmark     public List&lt;Integer&gt; toList() {         return sourceList.stream().toList();     }      @Benchmark     public List&lt;Integer&gt; copyOf() {         return List.copyOf(sourceList);     }      @Benchmark     public List&lt;Integer&gt; collectToList() {         return sourceList.stream().collect(Collectors.toList());     }      @Benchmark     public List&lt;Integer&gt; collectToUnmodifiableList() {         return sourceList.stream().collect(Collectors.toUnmodifiableList());     } }<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0414\u0435\u0442\u0430\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">OpenJDK 64-Bit Server VM (build 16+36-2231, mixed mode, sharing) Intel Core i5-9500 3.00GHZ \u041e\u043f\u0446\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430: -f 3 -wi 3 -w 5 -i 5 -r 5 -t 6 -jvmArgs -XX:+UseParallelGC<\/code><\/pre>\n<\/div><\/div>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/z5\/fd\/n5\/z5fdn50ysudn59pxazccx9g9o6e.png\">  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043d\u0430\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e <code>Stream.toList()<\/code> \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 <code>collect(Collectors.toList())<\/code>, \u043d\u043e \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0434\u0430\u0436\u0435 <code>List.copyOf()<\/code>! \u042d\u0442\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0432 <code>List.copyOf()<\/code> \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 <code>requireNonNull<\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 <code>null<\/code>-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a <code>Stream.toList()<\/code> \u043d\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 <code>null<\/code> \u0438 \u0432 \u043d\u0451\u043c \u0442\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430. \u041d\u0430 \u043c\u0430\u043b\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u0445 <code>List.copyOf()<\/code> \u0432\u0441\u0451 \u0436\u0435 \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 <code>null<\/code> \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0446\u0435\u0440\u0435\u043c\u043e\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0441\u0442\u044c \u0443 <code>Stream<\/code>: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 <code>Spliterator<\/code>, <code>ReferencePipeline<\/code> \u0438 \u0442.\u0434.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0442\u043e\u0447\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u0434\u043d\u0443 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e <code>filter()<\/code>:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 JMH-\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">import org.openjdk.jmh.annotations.*;  import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.IntStream;  @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) @State(Scope.Thread) public class ToListFilter {      @Param({&quot;10&quot;, &quot;100&quot;, &quot;1000&quot;})     private int size;      private List&lt;Integer&gt; sourceList;      @Setup     public void setup() {         sourceList = IntStream                 .range(0, size)                 .boxed()                 .collect(Collectors.toList());     }      @Benchmark     public List&lt;Integer&gt; toList() {         return sourceList.stream().filter(i -&gt; i % 2 == 0).toList();     }      @Benchmark     public List&lt;Integer&gt; newArrayList() {         var list = new ArrayList&lt;Integer&gt;();         for (var i : sourceList) {             if (i % 2 == 0) {                 list.add(i);             }         }         return list;     }      @Benchmark     public List&lt;Integer&gt; collectToList() {         return sourceList.stream().filter(i -&gt; i % 2 == 0).collect(Collectors.toList());     }      @Benchmark     public List&lt;Integer&gt; collectToUnmodifiableList() {         return sourceList.stream().filter(i -&gt; i % 2 == 0).collect(Collectors.toUnmodifiableList());     } }<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0414\u0435\u0442\u0430\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">OpenJDK 64-Bit Server VM (build 16+36-2231, mixed mode, sharing) Intel Core i5-9500 3.00GHZ \u041e\u043f\u0446\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430: -f 3 -wi 3 -w 5 -i 5 -r 5 -t 6 -jvmArgs -XX:+UseParallelGC<\/code><\/pre>\n<\/div><\/div>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ot\/ya\/3j\/otya3ji40wqxdou0zfrbyk9hksu.png\"><\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0442\u043e\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435! \u0418 \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 <code>Stream.toList()<\/code> \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u0438\u0433\u0440\u0430\u043b \u0434\u0430\u0436\u0435 \u0443 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e <code>new ArrayList()<\/code> \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0432 \u0446\u0438\u043a\u043b\u0435. \u041a\u0430\u043a \u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0435 <code>Stream.toArray()<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 <a href=\"https:\/\/github.com\/openjdk\/jdk\/blob\/master\/src\/java.base\/share\/classes\/java\/util\/stream\/SpinedBuffer.java\" rel=\"nofollow noopener noreferrer\"><code>SpinedBuffer<\/code><\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430 \u0434\u043b\u044f \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0447\u0435\u043c <code>ArrayList<\/code>. \u041e\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432, \u0433\u0434\u0435 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0438\u043c\u0435\u044e\u0442 \u0434\u043b\u0438\u043d\u044b \u0432 \u0432\u0438\u0434\u0435 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u044e\u0449\u0438\u0445 \u0441\u0442\u0435\u043f\u0435\u043d\u0435\u0439 \u0434\u0432\u043e\u0439\u043a\u0438 (\u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 chunk \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e). \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>SpinedBuffer<\/code> \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0440\u0438\u0441\u0443\u043d\u043a\u0430, \u0433\u0434\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0451\u043d \u0431\u0443\u0444\u0435\u0440 \u0441\u043e 100 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 (<code>Integer<\/code> \u043e\u0442 0 \u0434\u043e 99):<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/zk\/cu\/ng\/zkcungk6g89pq0-qahojljkqh2e.png\">  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 <code>ArrayList<\/code> \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u0435\u0449\u0451 \u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0432 1.5 \u0440\u0430\u0437\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0447\u0430\u0449\u0435, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u043c \u0440\u0430\u0441\u0445\u043e\u0434\u0430\u043c. <code>ArrayList<\/code> \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>add()<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 <code>SpinedBuffer<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0442\u043e\u0447\u0435\u043d \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0418\u0437\u043b\u0438\u0448\u043d\u0438\u0439 \u0440\u0430\u0441\u0445\u043e\u0434 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043d\u0435 \u0438\u0433\u0440\u0430\u0435\u0442 \u0440\u043e\u043b\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043d\u0435\u0434\u043e\u043b\u0433\u043e\u0436\u0438\u0432\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434: <code>Stream.toList()<\/code> \u043a\u043e\u0440\u043e\u0447\u0435, \u0447\u0438\u0449\u0435 \u0438 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c <code>collect(Collectors.toList())<\/code>. \u0422\u0430\u043a \u0447\u0442\u043e \u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0431\u044b\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 (\u0445\u043e\u0442\u044f <code>Collectors.toList()<\/code> \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u0432\u0441\u0451 \u0435\u0449\u0451 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0443\u0436\u0435\u043d, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u043a downstream <code>Collector<\/code> \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 <code>Collector<\/code>&#8216;\u043e\u0432). \u0415\u0441\u043b\u0438 \u0436\u0435 \u043d\u0443\u0436\u0435\u043d \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>collect(Collectors.toCollection(ArrayList::new))<\/code>.<\/p>\n<h3>2. <code>String<\/code>: <code>formatted()<\/code>, <code>stripIndent()<\/code> \u0438 <code>translateEscapes()<\/code><\/h3>\n<p>  <\/p>\n<h4>\u041f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432: Java 15<\/h4>\n<p>  <\/p>\n<p>\u0412 Java 15 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c <a href=\"https:\/\/openjdk.java.net\/jeps\/378\" rel=\"nofollow noopener noreferrer\">\u0431\u043b\u043e\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430<\/a> &ndash; \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043b\u0438\u043d\u0438\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">String str = &quot;&quot;&quot;         \u041f\u0440\u0438\u0432\u0435\u0442,         \u042e\u0437\u0435\u0440!&quot;&quot;&quot;;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u043e \u0431\u043b\u043e\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0437\u0430\u043c\u0435\u043d\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">String str = String.format(&quot;&quot;&quot;         \u041f\u0440\u0438\u0432\u0435\u0442,         %s!&quot;&quot;&quot;, user);<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043b\u0438 \u0432\u0430\u043c, \u0447\u0442\u043e \u043a\u043e\u0434 \u0432\u044b\u0448\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u043c? \u041c\u043d\u0435 \u0432\u043e\u0442 \u0442\u043e\u0436\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f. \u041d\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u0447\u0438\u0449\u0435. \u042d\u0442\u043e \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/15\/docs\/api\/java.base\/java\/lang\/String.html#formatted(java.lang.Object...)\" rel=\"nofollow noopener noreferrer\"><code>String.formatted()<\/code><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043e\u043c <code>String.format()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">String str = &quot;&quot;&quot;         \u041f\u0440\u0438\u0432\u0435\u0442,         %s!&quot;&quot;&quot;.formatted(user);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u043a\u0430\u0436\u0435\u0442\u0435, \u0447\u0442\u043e \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043b\u0438\u0448\u044c \u0432 \u0442\u0440\u0451\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u0445 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u043e, \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435 \u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0435 (\u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0441\u0430\u043c\u0438), \u0430 \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043e\u043d \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u0435\u043d.<\/p>\n<p>  <\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, <code>formatted()<\/code> \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430\u043c\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">String str = &quot;\u041f\u0440\u0438\u0432\u0435\u0442, %s!&quot;.formatted(user);<\/code><\/pre>\n<p>  <\/p>\n<p>\u041b\u0438\u0447\u043d\u043e \u043c\u043d\u0435 \u043c\u0435\u0442\u043e\u0434 \u043e\u0447\u0435\u043d\u044c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u0438 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0432\u0437\u044f\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0432\u043e\u043e\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043c\u0435\u0442\u043e\u0434, \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0432 Java 15 &ndash; \u044d\u0442\u043e <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/15\/docs\/api\/java.base\/java\/lang\/String.html#stripIndent()\" rel=\"nofollow noopener noreferrer\"><code>String.stripIndent()<\/code><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043e\u0431\u0449\u0438\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0432\u0441\u0435\u0445 \u043b\u0438\u043d\u0438\u0439. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b <code>hello.txt<\/code> \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">    \u041f\u0440\u0438\u0432\u0435\u0442,     \u042e\u0437\u0435\u0440!<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0441\u043b\u0435\u0432\u0430, \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <code>stripIndent()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">String str = Files.readString(Path.of(&quot;hello.txt&quot;)).stripIndent(); System.out.println(str);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\u041f\u0440\u0438\u0432\u0435\u0442, \u042e\u0437\u0435\u0440!<\/code><\/pre>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0442\u0440\u0435\u0442\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 &ndash; \u044d\u0442\u043e <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/15\/docs\/api\/java.base\/java\/lang\/String.html#translateEscapes()\" rel=\"nofollow noopener noreferrer\"><code>String.translateEscapes()<\/code><\/a>. \u041e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0432\u0435\u0449\u044c: \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u0438\u0445 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b hello.txt:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\u041f\u0440\u0438\u0432\u0435\u0442,\\n\u042e\u0437\u0435\u0440!<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"java\">String str = Files.readString(Path.of(&quot;hello.txt&quot;)).translateEscapes(); System.out.println(str);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\u041f\u0440\u0438\u0432\u0435\u0442, \u042e\u0437\u0435\u0440!<\/code><\/pre>\n<h3>3. <code>CharSequence.isEmpty()<\/code>, <code>CharSequence.compare()<\/code> \u0438 <code>StringBuilder.compareTo()<\/code><\/h3>\n<p>  <\/p>\n<h4>\u041f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432: Java 15 \/ Java 11<\/h4>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443\u0436 \u043c\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u0442\u0435\u043c\u0443 \u0441\u0442\u0440\u043e\u043a, \u0442\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u044c\u0451\u043c \u0435\u0451 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.<\/p>\n<p>  <\/p>\n<p>\u0422\u043e\u0442, \u043a\u0442\u043e \u043f\u0438\u0441\u0430\u043b \u043d\u0430 Java 1.5 \u0438\u043b\u0438 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445, \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <code>String<\/code> \u0432 \u0442\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e \u043c\u0435\u0442\u043e\u0434\u0430 <code>isEmpty()<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0430 \u043f\u0443\u0441\u0442\u043e\u0442\u0443 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>length()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">if (str.length() != 0) {     ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u043e, \u0438 \u0432 Java 1.6 \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.oracle.com\/javase\/6\/docs\/api\/java\/lang\/String.html#isEmpty()\" rel=\"nofollow noopener noreferrer\"><code>String.isEmpty()<\/code><\/a> \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u0437\u0430\u0432\u0435\u0437\u043b\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">if (!str.isEmpty()) {     ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u043e \u0442\u043e, \u0447\u0442\u043e <code>String<\/code> &ndash; \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <code>CharSequence<\/code> (\u0445\u043e\u0442\u044c \u0438 \u0441\u0430\u043c\u0430\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f), \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u0443\u043c\u0430\u043b\u0438, \u0438 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0442\u0443\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435 \u0441\u0442\u0430\u043b\u0438 (\u0432\u043f\u0440\u043e\u0447\u0435\u043c, \u0431\u0435\u0437 <code>default<\/code>-\u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043e\u043d\u0438 \u0431\u044b \u044d\u0442\u043e\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0438). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043f\u0443\u0441\u0442\u043e\u0442\u0443 <code>StringBuilder<\/code> \u0432\u0441\u0451 \u0435\u0449\u0451 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>length()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">if (stringBuilder.length() != 0) {     ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u0441\u043f\u0443\u0441\u0442\u044f 14 \u043b\u0435\u0442 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438 \u044d\u0442\u043e: \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Java 15, \u043c\u0435\u0442\u043e\u0434 <code>isEmpty()<\/code> \u0435\u0441\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0443 <code>String<\/code>, \u043d\u043e \u0438 \u0443 \u043b\u044e\u0431\u043e\u0439 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/15\/docs\/api\/java.base\/java\/lang\/CharSequence.html#isEmpty()\" rel=\"nofollow noopener noreferrer\"><code>CharSequence<\/code><\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">if (!stringBuilder.isEmpty()) {     ... }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0430 <code>CharSequence<\/code> \u043d\u0430 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e. \u041c\u0435\u0442\u043e\u0434 <code>equals()<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f: \u0430 \u0432\u0434\u0440\u0443\u0433 \u043e\u043d \u043d\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438? \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f: \u043b\u0438\u0431\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 <code>CharSequence<\/code> \u0432 <code>String<\/code> \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u043e, \u043b\u0438\u0431\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Java 11, \u0432\u0441\u0451 \u044d\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/CharSequence.html#compare(java.lang.CharSequence,java.lang.CharSequence)\" rel=\"nofollow noopener noreferrer\"><code>CharSequence.compare()<\/code><\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">if (CharSequence.compare(charSeq1, charSeq2) == 0) {     ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>compare()<\/code> \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u0441\u0442\u0430 \u043d\u0430 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e, \u043d\u043e \u0438 \u0434\u043b\u044f \u043b\u0435\u043a\u0441\u0438\u043a\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432 Java 11 \u043a\u043b\u0430\u0441\u0441 <code>StringBuilder<\/code> \u0441\u0442\u0430\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>Comparable<\/code>, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 <code>StringBuilder<\/code> \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/StringBuilder.html#compareTo(java.lang.StringBuilder)\" rel=\"nofollow noopener noreferrer\"><code>compareTo()<\/code><\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">if (stringBuilder1.compareTo(stringBuilder2) == 0) {     ... }<\/code><\/pre>\n<h3>4. <code>Collectors.filtering()<\/code> \u0438 <code>Collectors.flatMapping()<\/code><\/h3>\n<p>  <\/p>\n<h4>\u041f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432: Java 9<\/h4>\n<p>  <\/p>\n<p>\u0427\u0430\u0441\u0442\u043e \u043b\u0438 \u0432\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>Collectors.groupingBy()<\/code>? \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0432\u044b \u0432\u0435\u0434\u0451\u0442\u0435 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0444\u0438\u043b\u044c\u043c\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">record Movie(String title, String genre, double rating) { }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u043c\u044b \u043f\u043e \u0436\u0430\u043d\u0440\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Stream&lt;Movie&gt; allMovies = Stream.of(     new Movie(&quot;\u041a\u043e\u043c\u043c\u0430\u043d\u0434\u043e&quot;, &quot;\u0411\u043e\u0435\u0432\u0438\u043a&quot;, 7.385),     new Movie(&quot;\u0422\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440&quot;, &quot;\u0411\u043e\u0435\u0432\u0438\u043a&quot;, 7.974),     new Movie(&quot;\u0422\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440 2&quot;, &quot;\u0411\u043e\u0435\u0432\u0438\u043a&quot;, 8.312),     new Movie(&quot;\u041c\u043e\u043b\u0447\u0430\u043d\u0438\u0435 \u044f\u0433\u043d\u044f\u0442&quot;, &quot;\u0422\u0440\u0438\u043b\u043b\u0435\u0440&quot;, 8.33),     new Movie(&quot;\u041a\u0440\u0438\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0442\u0438\u0432\u043e&quot;, &quot;\u0422\u0440\u0438\u043b\u043b\u0435\u0440&quot;, 8.619),     new Movie(&quot;\u0422\u0438\u0442\u0430\u043d\u0438\u043a&quot;, &quot;\u041c\u0435\u043b\u043e\u0434\u0440\u0430\u043c\u0430&quot;, 8.363),     new Movie(&quot;\u0421\u0435\u043c\u044c\u044f\u043d\u0438\u043d&quot;, &quot;\u041a\u043e\u043c\u0435\u0434\u0438\u044f&quot;, 7.699) );  Map&lt;String, List&lt;Movie&gt;&gt; groups = allMovies.collect(     Collectors.groupingBy(Movie::genre));  groups.forEach((genre, movies) -&gt; {     System.out.println(genre + &quot;:&quot;);     movies.forEach(movie -&gt;         System.out.printf(&quot;    %s: %.2f%n&quot;, movie.title(), movie.rating())); });<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\u041c\u0435\u043b\u043e\u0434\u0440\u0430\u043c\u0430:     \u0422\u0438\u0442\u0430\u043d\u0438\u043a: 8.36 \u0411\u043e\u0435\u0432\u0438\u043a:     \u041a\u043e\u043c\u043c\u0430\u043d\u0434\u043e: 7.39     \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440: 7.97     \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440 2: 8.31 \u0422\u0440\u0438\u043b\u043b\u0435\u0440:     \u041c\u043e\u043b\u0447\u0430\u043d\u0438\u0435 \u044f\u0433\u043d\u044f\u0442: 8.33     \u041a\u0440\u0438\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0442\u0438\u0432\u043e: 8.62 \u041a\u043e\u043c\u0435\u0434\u0438\u044f:     \u0421\u0435\u043c\u044c\u044f\u043d\u0438\u043d: 7.70<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0432\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0441\u0435 \u0444\u0438\u043b\u044c\u043c\u044b, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435, \u0443 \u043a\u043e\u0433\u043e \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0432\u044b\u0448\u0435 8. \u041a\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435? \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, <code>Stream.filter()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">Map&lt;String, List&lt;Movie&gt;&gt; groups = allMovies     .filter(movie -&gt; movie.rating() &gt; 8)     .collect(Collectors.groupingBy(Movie::genre));<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\u041c\u0435\u043b\u043e\u0434\u0440\u0430\u043c\u0430:     \u0422\u0438\u0442\u0430\u043d\u0438\u043a: 8.36 \u0411\u043e\u0435\u0432\u0438\u043a:     \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440 2: 8.31 \u0422\u0440\u0438\u043b\u043b\u0435\u0440:     \u041c\u043e\u043b\u0447\u0430\u043d\u0438\u0435 \u044f\u0433\u043d\u044f\u0442: 8.33     \u041a\u0440\u0438\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0442\u0438\u0432\u043e: 8.62<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u0432\u043e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0432\u0430\u043c \u0432\u0434\u0440\u0443\u0433 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0441\u0435 \u0436\u0430\u043d\u0440\u044b, \u0434\u0430\u0436\u0435 \u0442\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u043f\u0430\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0438\u043b\u044c\u043c\u0430 \u0441 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u043c \u0432\u044b\u0448\u0435 8. \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c? \u041e\u0442\u0432\u0435\u0442: \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Java, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0435\u0439 \u0435\u0441\u0442\u044c <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/stream\/Collectors.html#filtering(java.util.function.Predicate,java.util.stream.Collector)\" rel=\"nofollow noopener noreferrer\"><code>Collectors.filtering()<\/code><\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">Map&lt;String, List&lt;Movie&gt;&gt; groups = allMovies.collect(     Collectors.groupingBy(Movie::genre,         Collectors.filtering(movie -&gt; movie.rating() &gt; 8,             Collectors.toList())));  groups.forEach((genre, movies) -&gt; {     System.out.println(genre + &quot;:&quot;);     if (movies.isEmpty()) {         System.out.println(&quot;    &lt;\u0424\u0438\u043b\u044c\u043c\u043e\u0432 \u0441 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u043c \u0432\u044b\u0448\u0435 8 \u043d\u0435\u0442&gt;&quot;);     } else {         movies.forEach(movie -&gt;             System.out.printf(&quot;    %s: %.2f%n&quot;, movie.title(), movie.rating()));     } });<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u044c <code>groupingBy()<\/code>, \u0438 \u043f\u043e\u0442\u0435\u0440\u0438 \u0436\u0430\u043d\u0440\u043e\u0432 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\u041c\u0435\u043b\u043e\u0434\u0440\u0430\u043c\u0430:     \u0422\u0438\u0442\u0430\u043d\u0438\u043a: 8.36 \u0411\u043e\u0435\u0432\u0438\u043a:     \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440 2: 8.31 \u0422\u0440\u0438\u043b\u043b\u0435\u0440:     \u041c\u043e\u043b\u0447\u0430\u043d\u0438\u0435 \u044f\u0433\u043d\u044f\u0442: 8.33     \u041a\u0440\u0438\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0442\u0438\u0432\u043e: 8.62 \u041a\u043e\u043c\u0435\u0434\u0438\u044f:     &lt;\u0424\u0438\u043b\u044c\u043c\u043e\u0432 \u0441 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u043c \u0432\u044b\u0448\u0435 8 \u043d\u0435\u0442&gt;<\/code><\/pre>\n<p>\u041e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0444\u0438\u043b\u044c\u043c\u044b \u0430\u043a\u0442\u0451\u0440\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">record Movie(String title, String genre, double rating, List&lt;String&gt; actors) { }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0441\u0435\u0445 \u0430\u043a\u0442\u0451\u0440\u043e\u0432 \u0441 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043f\u043e \u0436\u0430\u043d\u0440\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">Stream&lt;Movie&gt; allMovies = Stream.of(     new Movie(&quot;\u041a\u043e\u043c\u043c\u0430\u043d\u0434\u043e&quot;, &quot;\u0411\u043e\u0435\u0432\u0438\u043a&quot;, 7.385,         List.of(&quot;\u0428\u0432\u0430\u0440\u0446\u0435\u043d\u0435\u0433\u0433\u0435\u0440&quot;, &quot;\u0427\u043e\u043d\u0433&quot;, &quot;\u0425\u0435\u0434\u0430\u0439\u044f&quot;)),     new Movie(&quot;\u0422\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440&quot;, &quot;\u0411\u043e\u0435\u0432\u0438\u043a&quot;, 7.974,         List.of(&quot;\u0428\u0432\u0430\u0440\u0446\u0435\u043d\u0435\u0433\u0433\u0435\u0440&quot;, &quot;\u0411\u0438\u043d&quot;, &quot;\u0425\u044d\u043c\u0438\u043b\u0442\u043e\u043d&quot;)),     new Movie(&quot;\u0422\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440 2&quot;, &quot;\u0411\u043e\u0435\u0432\u0438\u043a&quot;, 8.312,         List.of(&quot;\u0428\u0432\u0430\u0440\u0446\u0435\u043d\u0435\u0433\u0433\u0435\u0440&quot;, &quot;\u0425\u044d\u043c\u0438\u043b\u0442\u043e\u043d&quot;, &quot;\u0424\u0435\u0440\u043b\u043e\u043d\u0433&quot;, &quot;\u041f\u0430\u0442\u0440\u0438\u043a&quot;)),     new Movie(&quot;\u041c\u043e\u043b\u0447\u0430\u043d\u0438\u0435 \u044f\u0433\u043d\u044f\u0442&quot;, &quot;\u0422\u0440\u0438\u043b\u043b\u0435\u0440&quot;, 8.33,         List.of(&quot;\u0424\u043e\u0441\u0442\u0435\u0440&quot;, &quot;\u0425\u043e\u043f\u043a\u0438\u043d\u0441&quot;)),     new Movie(&quot;\u041a\u0440\u0438\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0442\u0438\u0432\u043e&quot;, &quot;\u0422\u0440\u0438\u043b\u043b\u0435\u0440&quot;, 8.619,         List.of(&quot;\u0422\u0440\u0430\u0432\u043e\u043b\u0442\u0430&quot;, &quot;\u0423\u0438\u043b\u043b\u0438\u0441&quot;, &quot;\u0414\u0436\u0435\u043a\u0441\u043e\u043d&quot;, &quot;\u0422\u0443\u0440\u043c\u0430\u043d&quot;)),     new Movie(&quot;\u0422\u0438\u0442\u0430\u043d\u0438\u043a&quot;, &quot;\u041c\u0435\u043b\u043e\u0434\u0440\u0430\u043c\u0430&quot;, 8.363,         List.of(&quot;\u0414\u0438\u041a\u0430\u043f\u0440\u0438\u043e&quot;, &quot;\u0423\u0438\u043d\u0441\u043b\u0435\u0442&quot;)),     new Movie(&quot;\u0421\u0435\u043c\u044c\u044f\u043d\u0438\u043d&quot;, &quot;\u041a\u043e\u043c\u0435\u0434\u0438\u044f&quot;, 7.699,         List.of(&quot;\u041a\u0435\u0439\u0434\u0436&quot;, &quot;\u041b\u0435\u043e\u043d\u0438&quot;)) );<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0443\u043d\u0443\u0442\u044c \u0432 <code>groupingBy()<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435\u0445 \u0430\u043a\u0442\u0451\u0440\u043e\u0432 \u0432 <code>Set<\/code>? \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c <code>Collectors.mapping()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">Map&lt;String, Set&lt;List&lt;String&gt;&gt;&gt; groups = allMovies.collect(     Collectors.groupingBy(Movie::genre,         Collectors.mapping(Movie::actors, Collectors.toSet())));<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e. \u0427\u0442\u043e \u0436\u0435 \u0434\u0435\u043b\u0430\u0442\u044c? \u0418 \u0442\u0443\u0442 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/stream\/Collectors.html#flatMapping(java.util.function.Function,java.util.stream.Collector)\" rel=\"nofollow noopener noreferrer\"><code>Collectors.flatMapping()<\/code><\/a>, \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0432 Java 9:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">Map&lt;String, Set&lt;String&gt;&gt; groups = allMovies.collect(     Collectors.groupingBy(Movie::genre,         Collectors.flatMapping(movie -&gt; movie.actors().stream(),             Collectors.toSet())));<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0432\u043e\u0442 \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u0438\u043f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439! \u0415\u0441\u043b\u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u044d\u0442\u043e, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\u041c\u0435\u043b\u043e\u0434\u0440\u0430\u043c\u0430:     \u0414\u0438\u041a\u0430\u043f\u0440\u0438\u043e     \u0423\u0438\u043d\u0441\u043b\u0435\u0442 \u0411\u043e\u0435\u0432\u0438\u043a:     \u0411\u0438\u043d     \u0424\u0435\u0440\u043b\u043e\u043d\u0433     \u0425\u0435\u0434\u0430\u0439\u044f     \u041f\u0430\u0442\u0440\u0438\u043a     \u0428\u0432\u0430\u0440\u0446\u0435\u043d\u0435\u0433\u0433\u0435\u0440     \u0425\u044d\u043c\u0438\u043b\u0442\u043e\u043d     \u0427\u043e\u043d\u0433 \u0422\u0440\u0438\u043b\u043b\u0435\u0440:     \u0422\u0440\u0430\u0432\u043e\u043b\u0442\u0430     \u0423\u0438\u043b\u043b\u0438\u0441     \u0425\u043e\u043f\u043a\u0438\u043d\u0441     \u0424\u043e\u0441\u0442\u0435\u0440     \u0414\u0436\u0435\u043a\u0441\u043e\u043d     \u0422\u0443\u0440\u043c\u0430\u043d \u041a\u043e\u043c\u0435\u0434\u0438\u044f:     \u041a\u0435\u0439\u0434\u0436     \u041b\u0435\u043e\u043d\u0438<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c.<\/p>\n<h3>5. <code>StackWalker<\/code><\/h3>\n<p>  <\/p>\n<h4>\u041f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432: Java 9<\/h4>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043b\u0438 \u0432\u0430\u043c \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e \u0441\u043e \u0441\u0442\u0435\u043a\u0430\u043c\u0438? \u041d\u0435 \u0441\u043e \u0441\u0442\u0435\u043a\u0430\u043c\u0438 \u0432 \u0441\u043c\u044b\u0441\u043b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0441\u043e \u0441\u0442\u0435\u043a\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u0432? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043b\u043e\u0433\u0433\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public final class MyLogger {     public static void log(String message) {         System.out.println(message);     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0433\u043e\u043b\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0430 \u0435\u0449\u0451 \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0441\u0430, \u043c\u0435\u0442\u043e\u0434\u0430, \u0444\u0430\u0439\u043b\u0430 \u0438 \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>log()<\/code>. \u0412 Java 8 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>StackTraceElement[]<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>Thread.getStackTrace()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public static void log(String message) {     StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();     StackTraceElement stackTraceElement = stackTrace[2];     String msg = stackTraceElement.getClassName() + &quot;.&quot;                + stackTraceElement.getMethodName() + &quot;(&quot;                + stackTraceElement.getFileName() + &quot;:&quot;                + stackTraceElement.getLineNumber() + &quot;) &quot;                + message;     System.out.println(msg); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0441\u0442\u0440\u043e\u043a \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u0440\u043e\u0433\u0438\u043c. \u0412\u0435\u0434\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0435\u0441\u044c \u0441\u0442\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u043c (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u044d\u043d\u0442\u0435\u0440\u043f\u0440\u0430\u0439\u0437\u0435, \u0433\u0434\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043d\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435), \u0430 \u043f\u043e\u0442\u043e\u043c \u0435\u0449\u0451 \u0438 \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b JVM \u0432 Java-\u043c\u0430\u0441\u0441\u0438\u0432. \u0418 \u0432\u0441\u0451 \u044d\u0442\u043e \u0440\u0430\u0434\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0447\u0442\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043c\u0435\u0440\u0438\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">@Benchmark public String stackTrace() {     StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();     StackTraceElement stackTraceElement = stackTrace[2];     return stackTraceElement.getClassName() + &quot;.&quot;          + stackTraceElement.getMethodName() + &quot;(&quot;          + stackTraceElement.getFileName() + &quot;:&quot;          + stackTraceElement.getLineNumber() + &quot;)&quot;; }<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0414\u0435\u0442\u0430\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">OpenJDK 64-Bit Server VM (build 16+36-2231, mixed mode, sharing) Intel Core i5-9500 3.00GHZ \u041e\u043f\u0446\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430: -f 1 -wi 3 -w 3 -i 5 -r 5 -t 6<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<pre><code class=\"java\">Benchmark          Mode  Cnt    Score   Error  Units Stack.stackTrace   avgt    5  103,704 ? 1,123  us\/op<\/code><\/pre>\n<p>  <\/p>\n<p>104 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432! \u042d\u0442\u043e \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e! \u0415\u0441\u0442\u044c \u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c? \u0415\u0441\u0442\u044c: \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/StackWalker.html\" rel=\"nofollow noopener noreferrer\"><code>StackWalker<\/code><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 Java 9. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u043f\u043e\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<\/p>\n<p>  <\/p>\n<p><code>StackWalker<\/code> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u00ab\u0433\u0443\u043b\u044f\u0442\u044c\u00bb \u043f\u043e \u0441\u0442\u0435\u043a\u0443. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>StackWalker<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/StackWalker.html#getInstance()\" rel=\"nofollow noopener noreferrer\"><code>StackWalker.getInstance()<\/code><\/a>. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>StackWalker<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043c\u0435\u0442\u043e\u0434 <code>getInstance()<\/code> \u043e\u043f\u0446\u0438\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <code>StackWalker<\/code> \u0441 \u0431\u043e\u043b\u0435\u0435 \u0431\u043e\u0433\u0430\u0442\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u041d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043e\u0431\u044a\u0435\u043a\u0442 <code>StackWalker<\/code>, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430 \u043d\u0451\u043c \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/StackWalker.html#forEach(java.util.function.Consumer)\" rel=\"nofollow noopener noreferrer\"><code>forEach()<\/code><\/a> \u0438 \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u0432\u0441\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u0430\u043c \u0441\u0442\u0435\u043a\u0430.<\/li>\n<li>\u0412\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/StackWalker.html#getCallerClass()\" rel=\"nofollow noopener noreferrer\"><code>getCallerClass()<\/code><\/a> \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u0432\u0430\u043b \u043d\u0430\u0448 \u043c\u0435\u0442\u043e\u0434 (\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043e\u043f\u0446\u0438\u0435\u0439 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/StackWalker.Option.html#RETAIN_CLASS_REFERENCE\" rel=\"nofollow noopener noreferrer\"><code>RETAIN_CLASS_REFERENCE<\/code><\/a>).<\/li>\n<li>\u0412\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/StackWalker.html#walk(java.util.function.Function)\" rel=\"nofollow noopener noreferrer\"><code>walk()<\/code><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u0437 <code>Stream&lt;StackFrame&gt;<\/code> \u0432 <code>T<\/code>, \u0433\u0434\u0435 <code>T<\/code> &ndash; \u044d\u0442\u043e \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e. \u042d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0433\u0438\u0431\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043b\u043e\u0433\u0433\u0435\u0440\u0430 \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u0440\u0435\u0442\u044c\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c. \u0412\u043e\u0442 \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 <code>log()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public static void log(String message) {     String msg = StackWalker         .getInstance()         .walk((Stream&lt;StackFrame&gt; frames) -&gt; {             StackFrame frame = frames.skip(2).findFirst().get();             return frame.getClassName() + &quot;.&quot;                  + frame.getMethodName() + &quot;(&quot;                  + frame.getFileName() + &quot;:&quot;                  + frame.getLineNumber() + &quot;) &quot;                  + message;         });     System.out.println(msg); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043c\u0435\u0440\u0438\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0441\u043e <code>StackWalker<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">@Benchmark public String stackWalker() {     return StackWalker         .getInstance()         .walk(frames -&gt; {             StackFrame frame = frames.skip(2).findFirst().get();             return frame.getClassName() + &quot;.&quot;                  + frame.getMethodName() + &quot;(&quot;                  + frame.getFileName() + &quot;:&quot;                  + frame.getLineNumber() + &quot;)&quot;;         }); }<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0414\u0435\u0442\u0430\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">OpenJDK 64-Bit Server VM (build 16+36-2231, mixed mode, sharing) Intel Core i5-9500 3.00GHZ \u041e\u043f\u0446\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430: -f 1 -wi 3 -w 3 -i 5 -r 5 -t 6<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<pre><code class=\"java\">Benchmark          Mode  Cnt    Score   Error  Units Stack.stackTrace   avgt    5  103,704 ? 1,123  us\/op Stack.stackWalker  avgt    5    2,781 ? 0,156  us\/op<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u044b\u0440\u043e\u0441\u043b\u0430 \u0432 37 \u0440\u0430\u0437! \u042d\u0442\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, 2.8 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u044d\u0442\u043e \u0432\u0441\u0451 \u0435\u0449\u0451 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e, \u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0443\u0436\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0431\u043e\u0435\u0432\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u0435\u0442\u043e\u0434 <code>StackWalker.walk()<\/code> \u0434\u0430\u0451\u0442 \u043d\u0430\u043c <code>Stream<\/code>, \u0442\u043e \u043d\u0430\u0448\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u043e\u0431\u0445\u043e\u0434\u0443 \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b: \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0444\u0440\u0435\u0439\u043c\u044b, \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e-\u0442\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u043c \u043d\u0430\u0448 \u043b\u043e\u0433\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u00ab\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u00bb, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0442\u0443\u0434\u0430 \u0443\u0440\u043e\u0432\u043d\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">package org.mylogger;  public final class MyLogger {     public enum Level {         ERROR, WARN, INFO     }      public static void error(String message) {         log(Level.ERROR, message);     }      public static void warn(String message) {         log(Level.WARN, message);     }      public static void info(String message) {         log(Level.INFO, message);     }      public static void log(Level level, String message) {         ...     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0443\u0436\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <code>frames.skip(2)<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434 <code>log()<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d \u043a\u0430\u043a \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0442\u0430\u043a \u0438 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434\u044b <code>error()<\/code>, <code>warn()<\/code>, <code>log()<\/code>, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0444\u0440\u0435\u0439\u043c \u043d\u0430\u0434\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u0443\u043c\u043d\u0435\u0435. \u0421\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 &ndash; \u0447\u0435\u0440\u0435\u0437 <code>Stream.dropWhile()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public static void log(Level level, String message) {     String msg = StackWalker         .getInstance()         .walk((Stream&lt;StackFrame&gt; frames) -&gt; {             StackFrame frame = frames                 .dropWhile(f -&gt; f.getClassName().startsWith(&quot;org.mylogger&quot;))                 .findFirst()                 .get();             return level + &quot; &quot;                  + frame.getClassName() + &quot;.&quot;                  + frame.getMethodName() + &quot;(&quot;                  + frame.getFileName() + &quot;:&quot;                  + frame.getLineNumber() + &quot;) &quot;                  + message;         });     System.out.println(msg); }<\/code><\/pre>\n<p>\u041a\u0430\u043a\u0438\u0435 \u0435\u0449\u0451 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0443 <code>StackWalker<\/code>?<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u0432 Java 9 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043c\u043e\u0434\u0443\u043b\u0438. \u041d\u043e \u043c\u0430\u043b\u043e \u043a\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0438\u0445 \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u0438 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0432\u0441\u0451 \u0435\u0449\u0451 \u043f\u0440\u0435\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0442\u044c \u0432\u0441\u0451 \u0432 classpath. \u041d\u043e \u0442\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u0446\u0435\u043d\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c &ndash; \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0430\u043a\u0435\u0442 <code>org.example.mylib.internal<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043d\u0438\u043a\u0442\u043e \u043a\u0440\u043e\u043c\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">package org.example.mylib.internal;  public final class Handler {     public static void handle() {         ...     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>Handler<\/code> \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0443\u0436\u0435 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u043c\u0435\u0448\u0430\u0435\u0442 \u043a\u043e\u043c\u0443 \u0443\u0433\u043e\u0434\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441. \u041d\u043e, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435? \u0418 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/StackWalker.html#getCallerClass()\" rel=\"nofollow noopener noreferrer\"><code>StackWalker.getCallerClass()<\/code><\/a>, \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u044d\u0442\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">package org.example.mylib.internal;  public final class Handler {     public static void handle() {         if (!StackWalker             .getInstance(Option.RETAIN_CLASS_REFERENCE)             .getCallerClass()             .getPackageName()             .startsWith(&quot;org.example.mylib.&quot;)) {             throw new RuntimeException(&quot;Security error&quot;);         }         ...     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u043f\u0446\u0438\u044e <code>RETAIN_CLASS_REFERENCE<\/code>, \u0438\u043d\u0430\u0447\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c Class \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0431\u044b. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0447\u0435\u0440\u0435\u0437 <code>Stream.walk()<\/code>, \u043d\u043e <code>getCallerClass()<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<h3>6. <code>System.Logger<\/code><\/h3>\n<p>  <\/p>\n<h4>\u041f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432: Java 9<\/h4>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443\u0436 \u043c\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e <a href=\"https:\/\/openjdk.java.net\/jeps\/264\" rel=\"nofollow noopener noreferrer\">\u043d\u043e\u0432\u043e\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 API \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0432 Java 9. \u042d\u0442\u043e API \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 \u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432\u0441\u0435\u0433\u043e \u0438\u0437 \u0442\u0440\u0451\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432: \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/System.Logger.html\" rel=\"nofollow noopener noreferrer\"><code>System.Logger<\/code><\/a>, \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/System.LoggerFinder.html\" rel=\"nofollow noopener noreferrer\"><code>System.LoggerFinder<\/code><\/a> \u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/System.Logger.Level.html\" rel=\"nofollow noopener noreferrer\"><code>System.Logger.Level<\/code><\/a>.<\/p>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>System.Logger<\/code> \u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public final class Main {     private static final Logger LOGGER = System.getLogger(&quot;&quot;);      public static void main(String[] args)  {         LOGGER.log(Level.ERROR, &quot;Critical error!&quot;);     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\u0430\u043f\u0440. 17, 2021 6:24:57 PM org.example.Main main SEVERE: Critical error!<\/code><\/pre>\n<p>  <\/p>\n<p><code>System.Logger<\/code> &ndash; \u044d\u0442\u043e \u043d\u0435 \u043d\u043e\u0432\u044b\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u0430\u043a \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u0441\u043d\u0430\u0447\u0430\u043b\u0430, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e <b>\u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434<\/b> \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u043c\u0438, \u0442\u043e \u0432\u0430\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u043e: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"http:\/\/www.slf4j.org\/\" rel=\"nofollow noopener noreferrer\">SLF4J<\/a> &ndash; \u044d\u0442\u043e \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434, \u0430 \u0435\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <a href=\"http:\/\/logback.qos.ch\/\" rel=\"nofollow noopener noreferrer\">Logback<\/a>. \u0418\u043b\u0438 <a href=\"https:\/\/logging.apache.org\/log4j\/2.x\/\" rel=\"nofollow noopener noreferrer\">Log4j API<\/a> &ndash; \u044d\u0442\u043e \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u0434\u043b\u044f Log4j Core. \u0422\u0430\u043a \u0432\u043e\u0442, <code>System.Logger<\/code> &ndash; \u044d\u0442\u043e \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u0434\u043b\u044f \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0433\u043e \u0432\u0430\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.logging\/java\/util\/logging\/package-summary.html\" rel=\"nofollow noopener noreferrer\"><code>java.util.logging<\/code><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435 <code>java.logging<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0434\u043b\u044f SLF4J \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0431\u044d\u043a\u0435\u043d\u0434, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/logging.apache.org\/log4j\/2.x\/log4j-slf4j-impl\/\" rel=\"nofollow noopener noreferrer\">Log4j<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/search.maven.org\/artifact\/org.slf4j\/slf4j-jdk14\" rel=\"nofollow noopener noreferrer\"><code>java.util.logging<\/code><\/a>. \u0418\u043b\u0438 \u0434\u043b\u044f Log4j API \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/logging.apache.org\/log4j\/2.x\/log4j-to-slf4j\/index.html\" rel=\"nofollow noopener noreferrer\">SLF4J<\/a> \u043a\u0430\u043a \u0431\u044d\u043a\u0435\u043d\u0434 \u0438\u043b\u0438 <a href=\"https:\/\/logging.apache.org\/log4j\/2.x\/log4j-jul\/index.html\" rel=\"nofollow noopener noreferrer\"><code>java.util.logging<\/code><\/a>. \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0438 \u0441 <code>System.Logger<\/code>: \u043e\u043d \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u043e\u0433\u043b\u0430 \u0431\u044b\u0442\u044c \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043b\u044e\u0431\u043e\u0439. \u0415\u0441\u043b\u0438 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0438 \u0441\u0442\u0430\u0440\u044b\u0439 <code>java.util.logging<\/code>, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 Log4j, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"xml\">&lt;dependency&gt;     &lt;groupId&gt;org.apache.logging.log4j&lt;\/groupId&gt;     &lt;artifactId&gt;log4j-api&lt;\/artifactId&gt;     &lt;version&gt;2.14.1&lt;\/version&gt; &lt;!-- \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 --&gt;     &lt;scope&gt;runtime&lt;\/scope&gt; &lt;\/dependency&gt; &lt;dependency&gt;     &lt;groupId&gt;org.apache.logging.log4j&lt;\/groupId&gt;     &lt;artifactId&gt;log4j-core&lt;\/artifactId&gt;     &lt;version&gt;2.14.1&lt;\/version&gt;     &lt;scope&gt;runtime&lt;\/scope&gt; &lt;\/dependency&gt; &lt;dependency&gt;     &lt;groupId&gt;org.apache.logging.log4j&lt;\/groupId&gt;     &lt;artifactId&gt;log4j-jpl&lt;\/artifactId&gt;     &lt;version&gt;2.14.1&lt;\/version&gt;     &lt;scope&gt;runtime&lt;\/scope&gt; &lt;\/dependency&gt;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0430\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f: \u0442\u043e, \u0447\u0442\u043e <code>log4j-jpl<\/code> \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432 classpath, \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. Java \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/ServiceLoader.html\" rel=\"nofollow noopener noreferrer\"><code>ServiceLoader<\/code><\/a> \u043d\u0430\u0439\u0434\u0451\u0442 \u043d\u0443\u0436\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <code>LoggerFinder<\/code> \u0432 \u0432\u0438\u0434\u0435 <code>Log4jSystemLoggerFinder<\/code> \u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u043e\u0433\u0438 \u0432 Log4j:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">18:24:57.941 [main] ERROR  - Critical error!<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044c <code>java.logging<\/code> \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u0436\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u0437 JRE\/JDK, \u0432\u0435\u0434\u044c \u043e\u043d \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d (\u0435\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0435 <code>java.util.logging<\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e).<\/p>\n<p>  <\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 <code>System.Logger<\/code> \u0434\u043b\u044f SLF4J\/Logback \u043d\u0435\u0442. \u041d\u043e \u0442\u0443\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u043e\u043b\u0435\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f &ndash; \u043f\u043e\u0445\u043e\u0436\u0435, \u0447\u0442\u043e \u0441\u0430\u043c \u043f\u0440\u043e\u0435\u043a\u0442 SLF4J \u043c\u0451\u0440\u0442\u0432. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 \u0432 <a href=\"https:\/\/github.com\/qos-ch\/slf4j\" rel=\"nofollow noopener noreferrer\">GitHub<\/a> \u0431\u044b\u043b \u043f\u043e\u043b\u0442\u043e\u0440\u0430 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434. \u0422\u0430\u043a \u0447\u0442\u043e Log4j \u0441\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &ndash; \u043e\u043d \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>System.Logger<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">LOGGER.log(Level.INFO, &quot;Information&quot;); LOGGER.log(Level.DEBUG, &quot;Sum of {} and {} is {}:&quot;, 2, 3, 2+3); LOGGER.log(Level.TRACE, () -&gt; &quot;Lazy message&quot;); LOGGER.log(Level.ERROR, &quot;Log exception&quot;, new Exception());<\/code><\/pre>\n<h3>7. <code>Lookup.defineHiddenClass()<\/code><\/h3>\n<p>  <\/p>\n<h4>\u041f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432: Java 15<\/h4>\n<p>  <\/p>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/post\/487636\/\">\u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437<\/a> \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043f\u0440\u043e \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/invoke\/MethodHandles.Lookup.html#defineClass(byte%5B%5D)\" rel=\"nofollow noopener noreferrer\"><code>MethodHandles.Lookup.defineClass()<\/code><\/a>, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u0430\u043a\u0435\u0442\u0435, \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u043a\u043b\u0430\u0441\u0441\u0430. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043d\u043e \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u0438\u043d\u0443\u0441: \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0431\u0443\u0434\u0435\u0442 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0436\u0438\u0437\u043d\u0438 \u0432\u0438\u0441\u0435\u0442\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0436\u0438\u0437\u043d\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430 \u043a\u043b\u0430\u0441\u0441\u0430). \u042d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0430 \u043b\u0435\u0442\u0443. \u041d\u043e \u0441 Java 15 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <a href=\"https:\/\/openjdk.java.net\/jeps\/371\" rel=\"nofollow noopener noreferrer\"><i>\u0441\u043a\u0440\u044b\u0442\u044b\u043c\u0438<\/i><\/a>.<\/p>\n<p>  <\/p>\n<p>\u0421\u043a\u0440\u044b\u0442\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/15\/docs\/api\/java.base\/java\/lang\/invoke\/MethodHandles.Lookup.html#defineHiddenClass(byte%5B%5D,boolean,java.lang.invoke.MethodHandles.Lookup.ClassOption...)\" rel=\"nofollow noopener noreferrer\"><code>Lookup.defineHiddenClass()<\/code><\/a>. \u041f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0439 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>Unsafe.defineAnonymousClass()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u043e\u0433\u043e \u043b\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u043c\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043d\u0435\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u0440\u043e\u0441\u0442\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0430\u043c <code>Unsafe.defineAnonymousClass()<\/code> \u0441 Java 15 \u0441\u0442\u0430\u043b deprecated for removal.<\/p>\n<p>  <\/p>\n<p>\u0421\u043a\u0440\u044b\u0442\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u043c\u0435\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041d\u0430 \u043d\u0438\u0445 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u044f\u043c\u043e \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b. \u0412\u0441\u0451 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044e.<\/li>\n<li>\u041e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043c\u044b\u043c\u0438. \u0418\u0445 \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u0439\u0442\u0438 \u043d\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438, \u043d\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 (\u0447\u0435\u0440\u0435\u0437 <code>Class.forName()<\/code>, <code>ClassLoader.loadClass()<\/code>, <code>ClassLoader.findLoadedClass()<\/code> \u0438 \u0442.\u0434.). \u041e\u0434\u043d\u0430\u043a\u043e \u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u043c\u0438 \u0438 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0438\u043c\u0435\u044e\u0442 \u0438\u043c\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 <code>&lt;\u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0435&gt;\/&lt;suffix&gt;<\/code> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>org.example.Temp\/0x0000000800cb8000<\/code>).<\/li>\n<li>\u041e\u043d\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0442\u0430\u043a\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u0447\u0442\u043e \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u0441 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0430, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0431\u0440\u0430\u043d\u044b \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u043c \u043c\u0443\u0441\u043e\u0440\u0430, \u043a\u043e\u0433\u0434\u0430 \u0438\u0445 <code>Class<\/code> \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c\u044b\u043c (\u043d\u043e \u0435\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0442\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u043e\u043f\u0446\u0438\u044e <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/15\/docs\/api\/java.base\/java\/lang\/invoke\/MethodHandles.Lookup.ClassOption.html#STRONG\" rel=\"nofollow noopener noreferrer\"><code>ClassOption.STRONG<\/code><\/a> \u0432 <code>defineHiddenClass()<\/code>).<\/li>\n<li>\u041e\u043d\u0438 \u043d\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u0441\u0442\u0435\u043a\u0442\u0440\u0435\u0439\u0441\u0430\u0445, \u0435\u0441\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u043f\u0446\u0438\u0438 <code>-XX:+UnlockDiagnosticVMOptions -XX:+ShowHiddenFrames<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0432\u044b \u0443\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441\u043e \u0441\u043a\u0440\u044b\u0442\u044b\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0438\u0445 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c. \u042d\u0442\u043e \u043b\u044f\u043c\u0431\u0434\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">jshell&gt; Runnable runnable = () -&gt; {} runnable ==&gt; $Lambda$26\/0x0000000800c0aa00@443b7951  jshell&gt; runnable.getClass().isHidden() $2 ==&gt; true<\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440\u0447\u0438\u043a \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0441\u0432\u043e\u0439 \u0441\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u00ab\u0441 \u043d\u0443\u043b\u044f\u00bb. \u041f\u0443\u0441\u0442\u044c \u043e\u043d \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0434\u0432\u0430 <code>int<\/code>&#8216;\u0430. \u0414\u043b\u044f \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f \u0431\u0443\u0434\u0435\u043c \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e javac, \u0430 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/bytebuddy.net\/#\/\" rel=\"nofollow noopener noreferrer\">ByteBuddy<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0435 \u0432 \u0432\u0438\u0434\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0431\u0430\u0439\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">byte[] bytes = new ByteBuddy()         .subclass(Object.class)         .name(&quot;org.example.Temp&quot;)         .defineMethod(&quot;sum&quot;, int.class, Modifier.PUBLIC)         .withParameters(int.class, int.class)         .intercept(new Implementation.Simple(                 MethodVariableAccess.INTEGER.loadFrom(1),                 MethodVariableAccess.INTEGER.loadFrom(2),                 Addition.INTEGER,                 MethodReturn.INTEGER))         .make()         .getBytes();<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438 \u043c\u044b \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441, \u043d\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0441 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">package org.example; public class Temp {     public int sum(int x, int y) {         return x + y;     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430, \u043c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438 \u0447\u0442\u043e-\u0442\u043e \u0441 \u043d\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">Lookup lookup = MethodHandles         .lookup()         .defineHiddenClass(bytes, false);  \/\/ \u0414\u043b\u044f \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c MethodHandle \u0432\u043c\u0435\u0441\u0442\u043e reflection Object obj = lookup         .findConstructor(lookup.lookupClass(), MethodType.methodType(void.class))         .invoke();  MethodHandle sumHandle = lookup.findVirtual(lookup.lookupClass(), &quot;sum&quot;,         MethodType.methodType(int.class, int.class, int.class));  \/\/ \u0412\u044b\u0437\u043e\u0432\u0435\u043c \u043c\u0435\u0442\u043e\u0434 sum. \u0414\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c 5 System.out.println(sumHandle.invoke(obj, 3, 2));<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u0451.<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u043d\u0435\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043c\u044b, \u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043b\u0430\u0441\u0441 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0440\u0430\u0437. \u041f\u043e \u0441\u0443\u0442\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043b\u0430\u0441\u0441:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">Lookup lookup1 = MethodHandles.lookup().defineHiddenClass(bytes, false); Lookup lookup2 = MethodHandles.lookup().defineHiddenClass(bytes, false); Lookup lookup3 = MethodHandles.lookup().defineHiddenClass(bytes, false); System.out.println(lookup1.lookupClass()); \/\/ class org.example.Temp\/0x0000000800cb4000 System.out.println(lookup2.lookupClass()); \/\/ class org.example.Temp\/0x0000000800cb4400 System.out.println(lookup3.lookupClass()); \/\/ class org.example.Temp\/0x0000000800cb4800<\/code><\/pre>\n<h3>8. \u041d\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432 <code>Math<\/code><\/h3>\n<p>  <\/p>\n<h4>\u041f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432: Java 9 \/ Java 15<\/h4>\n<p>  <\/p>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435, \u043a\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u0432 Java, \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u043b \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">int x = ... int y = ... long z = x * y;<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0442\u0435\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0432 Java, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0433\u043e\u0434\u0438\u0442\u044c \u0432 \u043b\u043e\u0432\u0443\u0448\u043a\u0443 \u0434\u0430\u0436\u0435 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0438: \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 <code>int<\/code> &ndash; \u044d\u0442\u043e \u0442\u043e\u0436\u0435 <code>int<\/code>, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0442\u043e, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>z<\/code> \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f <code>long<\/code>, \u043e\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0441\u043f\u0430\u0441\u0430\u0435\u0442. \u0414\u043b\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u043f\u0440\u0438\u043a\u0430\u0441\u0442\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0438\u0437 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0435\u0439 \u043a <code>long<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">long z = (long) x * y;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0435, \u0443 \u043c\u0435\u043d\u044f \u0432 \u043c\u043e\u0451\u043c \u043f\u0435\u0440\u0444\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0441\u0442\u0441\u043a\u043e\u043c \u043f\u043e\u0434\u0441\u043e\u0437\u043d\u0430\u043d\u0438\u0438 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u0435\u043b\u043a\u0438\u0439 \u043e\u0441\u0430\u0434\u043e\u043a. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043c\u043d\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u044d\u0442\u043e\u0442 \u044f\u0432\u043d\u044b\u0439 \u043a\u0430\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e \u043b\u0438 \u043a \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044e, \u0442\u043e \u043b\u0438 \u043a\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044e. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u044d\u0442\u0430 \u0430\u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u044f, \u0447\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u0441\u0442\u0443\u0435\u0442\u0441\u044f, \u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u043d\u0435\u0442. \u0412 \u043e\u0431\u0449\u0435\u043c, \u044f \u0445\u043e\u0447\u0443 \u043a\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u044f\u0441\u043d\u043e\u0441\u0442\u044c \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u0430\u0433\u0438\u0438. \u0421\u043f\u043e\u0441\u043e\u0431 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">\u0412\u043e\u0437\u044c\u043c\u0438 \u0434\u0432\u0430 int \u0438 \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u044c \u0438\u0445 \u0432 long \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0441 Java 9 \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0435\u0441\u0442\u044c. \u042d\u0442\u043e \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/Math.html#multiplyFull(int,int)\" rel=\"nofollow noopener noreferrer\"><code>Math.multiplyFull()<\/code><\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">long z = Math.multiplyFull(x, y);<\/code><\/pre>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439 \u0432 Java \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0443\u0442\u043e\u0440\u043d\u043e, \u0438 \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c, \u0432 Java 8 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0446\u0435\u043b\u0430\u044f \u043f\u0430\u0447\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <code>Math<\/code>:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>int toIntExact(long value)<\/code><\/li>\n<li><code>int incrementExact(int a)<\/code><\/li>\n<li><code>long incrementExact(long a)<\/code><\/li>\n<li><code>int decrementExact(int a)<\/code><\/li>\n<li><code>long decrementExact(long a)<\/code><\/li>\n<li><code>int negateExact(int a)<\/code><\/li>\n<li><code>long negateExact(long a)<\/code><\/li>\n<li><code>int addExact(int x, int y)<\/code><\/li>\n<li><code>long addExact(long x, long y)<\/code><\/li>\n<li><code>int subtractExact(int x, int y)<\/code><\/li>\n<li><code>long subtractExact(long x, long y)<\/code><\/li>\n<li><code>int multiplyExact(int x, int y)<\/code><\/li>\n<li><code>long multiplyExact(long x, long y)<\/code><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0438\u0445\u043e\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 &ndash; \u043b\u0443\u0447\u0448\u0435 \u0443\u0436 \u0443\u043f\u0430\u0434\u0451\u0442 \u0441\u0440\u0430\u0437\u0443, \u0447\u0435\u043c \u0433\u0434\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0437\u0436\u0435 \u0441 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u041d\u043e \u0432\u0441\u0435 \u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u0442\u0443\u0442 \u043f\u043e\u043a\u0440\u044b\u0442\u044b? \u041f\u043e\u0445\u043e\u0436\u0435, \u0447\u0442\u043e \u043d\u0435\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044f \u043d\u0435 \u0432\u0438\u0436\u0443 \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0442\u044c \u0438 \u0432 \u043e\u0447\u0435\u043d\u044c \u0440\u0435\u0434\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043d\u043e \u0432\u0441\u0451 \u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u0441\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">jshell&gt; Math.abs(Integer.MIN_VALUE) $1 ==&gt; -2147483648<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0436\u0435 \u0442\u0430\u043a, \u0432\u0435\u0434\u044c \u043c\u043e\u0434\u0443\u043b\u044c &ndash; \u044d\u0442\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e? \u042d\u0442\u043e \u0442\u0430\u043a, \u043d\u043e \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e 2147483648 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0432\u043b\u0435\u0437\u0430\u0435\u0442 \u0432 <code>int<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u043e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c. \u0427\u0442\u043e\u0431\u044b \u0432\u043e\u0442 \u0442\u0430\u043a \u043f\u043e \u0447\u0438\u0441\u0442\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u043d\u0430\u043f\u043e\u0440\u043e\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u0430\u043a\u043e\u0435, \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0438\u0442\u044c \u0441\u0435\u0431\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/15\/docs\/api\/java.base\/java\/lang\/Math.html#absExact(int)\" rel=\"nofollow noopener noreferrer\"><code>Math.absExact()<\/code><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 Java 15:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">jshell&gt; Math.absExact(Integer.MIN_VALUE) |  Exception java.lang.ArithmeticException: Overflow to represent absolute value of Integer.MIN_VALUE |        at Math.absExact (Math.java:1392) |        at (#1:1)  jshell&gt; Math.absExact(Long.MIN_VALUE) |  Exception java.lang.ArithmeticException: Overflow to represent absolute value of Long.MIN_VALUE |        at Math.absExact (Math.java:1438) |        at (#2:1)<\/code><\/pre>\n<p>\u0410 \u0437\u043d\u0430\u0435\u0442\u0435 \u043b\u0438 \u0432\u044b, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u043e\u0435 \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f -11 \u043d\u0430 3? \u0410 \u043e\u0441\u0442\u0430\u0442\u043e\u043a? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">jshell&gt; -11 \/ 3 $1 ==&gt; -3  jshell&gt; -11 % 3 $2 ==&gt; -2<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0443 \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0432\u0435\u0434\u044c <code>-11 = 3 * (-3) - 2<\/code>. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 Python, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0438\u043d\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">&gt;&gt;&gt; -11 \/ 3 -4 &gt;&gt;&gt; -11 % 3 1<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u044d\u0442\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u043e\u0436\u0435 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443 \u0432\u0435\u0440\u043d\u044b\u0439: <code>-11 = 3 * (-4) + 1<\/code>. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b: \u0441 \u043e\u0431\u0440\u0435\u0437\u0430\u043d\u0438\u0435\u043c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043d\u0443\u043b\u044f \u0438 \u0441 \u043e\u0431\u0440\u0435\u0437\u0430\u043d\u0438\u0435\u043c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043c\u0438\u043d\u0443\u0441 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438. Java \u0432\u044b\u0431\u0440\u0430\u043b\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431, Python &ndash; \u0432\u0442\u043e\u0440\u043e\u0439. \u041d\u0443 \u0430 \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u044f \u0445\u043e\u0447\u0443 \u0432 Java \u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e-\u043f\u0438\u0442\u043e\u043d\u043e\u0432\u0441\u043a\u0438? \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 Java 9 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043c\u0435\u0442\u043e\u0434\u044b <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/Math.html#floorDiv(int,int)\" rel=\"nofollow noopener noreferrer\"><code>Math.floorDiv()<\/code><\/a> \u0438 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/Math.html#floorMod(int,int)\" rel=\"nofollow noopener noreferrer\"><code>Math.floorMod()<\/code><\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">jshell&gt; Math.floorDiv(-11, 3) $1 ==&gt; -4  jshell&gt; Math.floorMod(-11, 3) $2 ==&gt; 1<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u043f\u043e\u0440\u043e\u0442\u044b\u0445 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0432 \u0432 Java 9 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/Math.html#fma(float,float,float)\" rel=\"nofollow noopener noreferrer\"><code>Math.fma(float, float, float)<\/code><\/a> \u0438 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/Math.html#fma(double,double,double)\" rel=\"nofollow noopener noreferrer\"><code>Math.fma(double, double, double)<\/code><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 <code>a * b + c<\/code>, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0447\u043d\u0435\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">jshell&gt; Math.fma(2.99, 5.91, 7.1) $1 ==&gt; 24.7709  jshell&gt; 2.99 * 5.91 + 7.1 $2 ==&gt; 24.770900000000005<\/code><\/pre>\n<h3>9. \u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <code>java.io.Serial<\/code><\/h3>\n<p>  <\/p>\n<h4>\u041f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432: Java 14<\/h4>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043b\u0438 \u0432\u044b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432 Java? \u042d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0438 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 <a href=\"https:\/\/www.youtube.com\/watch?v=dOgfWXw9VrI\" rel=\"nofollow noopener noreferrer\">\u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043c\u0438<\/a>, \u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0435\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e Java-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class Point {     private static final long serialVersionUID = 1L;      public int x;     public int y; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 <code>Point<\/code> \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442\u043e\u0432, \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u0447\u0435\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">var point = new Point(); point.x = 1; point.y = 2;  var baos = new ByteArrayOutputStream(); try (var oos = new ObjectOutputStream(baos)) {     oos.writeObject(point); } byte[] bytes = baos.toByteArray();<\/code><\/pre>\n<p>\u041e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e. \u041a\u0441\u0442\u0430\u0442\u0438, \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u043c\u043e\u0451\u043c \u043a\u043e\u0434\u0435? \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u044f \u0437\u0430\u0431\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>Serializable<\/code>! (\u042f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u043e\u043b\u0435 <code>serialVersionUID<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0432\u043b\u0435\u0447\u044c \u0432\u0430\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435.)<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class Point implements Serializable {     private static final long serialVersionUID = 1;      public int x;     public int y; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0432\u043e\u0442 \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 &ndash; \u043f\u0440\u0438 \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443: \u0437\u0430\u0431\u044b\u0442\u044c <code>Serializable<\/code>, \u043e\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u043b\u044f <code>serialVersionUID<\/code>, \u0437\u0430\u0431\u044b\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438 \u0442.\u0434. \u0427\u0442\u043e\u0431\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0442\u0430\u043a\u043e\u0433\u043e, \u0432 Java 14 \u0432\u0432\u0435\u043b\u0438 \u043d\u043e\u0432\u0443\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/14\/docs\/api\/java.base\/java\/io\/Serial.html\" rel=\"nofollow noopener noreferrer\"><code>Serial<\/code><\/a>.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043c\u0435\u0447\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u0438 \u043c\u0435\u0442\u043e\u0434\u044b, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0443 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class Point implements Serializable {     @Serial     private static final long serialVersionUID = 1;     ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u0442\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class Point {     @Serial \/\/ Annotated member is not a part of the serialization mechanism     private static final long serialVersionUID = 1;     ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u043b\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class Point implements Serializable {     @Serial \/\/ Annotated member is not a part of the serialization mechanism     private static final int serialVersionUID = 1;     ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044f\u0445 \u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438: <code>serialVersionUID<\/code>, <code>serialPersistentFields<\/code>, <code>writeObject()<\/code>, <code>readObject()<\/code> \u0438 \u0442.\u0434.<\/p>\n<p>  <\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 IntelliJ IDEA. \u0412 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0435 JDK 16 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u043c \u0444\u043b\u0430\u0433\u043e\u043c <code>-Xlint:serial<\/code> \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0435 \u0432\u0441\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0432\u044b\u0448\u0435 <code>javac<\/code> \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">&gt; javac -Xlint:serial Point.java Point.java:6: warning: [serial] serialVersionUID must be of type long in class Point     private static final int serialVersionUID = 1;                              ^<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044d\u0442\u043e <a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8202056\" rel=\"nofollow noopener noreferrer\">\u0438\u0441\u043f\u0440\u0430\u0432\u044f\u0442 \u0432 Java 17<\/a>.<\/p>\n<h3>10. \u041c\u0435\u0442\u043e\u0434\u044b <code>Objects<\/code>: <code>checkIndex()<\/code>, <code>checkFromIndexSize()<\/code>, <code>checkFromToIndex()<\/code><\/h3>\n<p>  <\/p>\n<h4>\u041f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432: Java 9 \/ Java 16<\/h4>\n<p>  <\/p>\n<p>\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u043c \u043d\u0430\u0448\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0438\u043b\u0438 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432, \u0438 \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">private static void getAt(int index, int length) {     if (index &lt; 0) {         throw new IllegalArgumentException(&quot;index &lt; 0&quot;);     }     if (index &gt;= length) {         throw new IllegalArgumentException(&quot;index &gt;= length&quot;);     }     ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0443\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u0442\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f, \u0442\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public final class PreconditionUtils {     public static void checkIndex(int index, int length) {         if (index &lt; 0) {             throw new IllegalArgumentException(&quot;index &lt; 0&quot;);         }         if (index &gt;= length) {             throw new IllegalArgumentException(&quot;index &gt;= length&quot;);         }     } }<\/code><\/pre>\n<p>\u041d\u043e \u0441 Java 9 \u0442\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <code>Objects<\/code> \u0442\u0435\u043f\u0435\u0440\u044c \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/Objects.html#checkIndex(int,int)\" rel=\"nofollow noopener noreferrer\"><code>Objects.checkIndex()<\/code><\/a> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 <code>[0, length)<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">jshell&gt; Objects.checkIndex(-3, 10) |  Exception java.lang.IndexOutOfBoundsException: Index -3 out of bounds for length 10 |        at Preconditions.outOfBounds (Preconditions.java:64) |        at Preconditions.outOfBoundsCheckIndex (Preconditions.java:70) |        at Preconditions.checkIndex (Preconditions.java:248) |        at Objects.checkIndex (Objects.java:372) |        at (#1:1)  jshell&gt; Objects.checkIndex(10, 10) |  Exception java.lang.IndexOutOfBoundsException: Index 10 out of bounds for length 10 |        at Preconditions.outOfBounds (Preconditions.java:64) |        at Preconditions.outOfBoundsCheckIndex (Preconditions.java:70) |        at Preconditions.checkIndex (Preconditions.java:248) |        at Objects.checkIndex (Objects.java:372) |        at (#2:1)<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/Objects.html#checkFromIndexSize(int,int,int)\" rel=\"nofollow noopener noreferrer\"><code>Objects.checkFromIndexSize()<\/code><\/a> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d <code>[fromIndex, fromIndex + size)<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 <code>[0, length)<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">jshell&gt; Objects.checkFromIndexSize(3, 8, 10) |  Exception java.lang.IndexOutOfBoundsException: Range [3, 3 + 8) out of bounds for length 10 |        at Preconditions.outOfBounds (Preconditions.java:64) |        at Preconditions.outOfBoundsCheckFromIndexSize (Preconditions.java:82) |        at Preconditions.checkFromIndexSize (Preconditions.java:343) |        at Objects.checkFromIndexSize (Objects.java:424) |        at (#3:1)  jshell&gt; Objects.checkFromIndexSize(-2, 8, 10) |  Exception java.lang.IndexOutOfBoundsException: Range [-2, -2 + 8) out of bounds for length 10 |        at Preconditions.outOfBounds (Preconditions.java:64) |        at Preconditions.outOfBoundsCheckFromIndexSize (Preconditions.java:82) |        at Preconditions.checkFromIndexSize (Preconditions.java:343) |        at Objects.checkFromIndexSize (Objects.java:424) |        at (#4:1)  jshell&gt; Objects.checkFromIndexSize(3, -4, 10) |  Exception java.lang.IndexOutOfBoundsException: Range [3, 3 + -4) out of bounds for length 10 |        at Preconditions.outOfBounds (Preconditions.java:64) |        at Preconditions.outOfBoundsCheckFromIndexSize (Preconditions.java:82) |        at Preconditions.checkFromIndexSize (Preconditions.java:343) |        at Objects.checkFromIndexSize (Objects.java:424) |        at (#5:1)<\/code><\/pre>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/Objects.html#checkFromToIndex(int,int,int)\" rel=\"nofollow noopener noreferrer\"><code>Objects.checkFromToIndex()<\/code><\/a> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d <code>[fromIndex, toIndex)<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 <code>[0, length)<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">jshell&gt; Objects.checkFromToIndex(3, 11, 10) |  Exception java.lang.IndexOutOfBoundsException: Range [3, 11) out of bounds for length 10 |        at Preconditions.outOfBounds (Preconditions.java:64) |        at Preconditions.outOfBoundsCheckFromToIndex (Preconditions.java:76) |        at Preconditions.checkFromToIndex (Preconditions.java:295) |        at Objects.checkFromToIndex (Objects.java:398) |        at (#6:1)  jshell&gt; Objects.checkFromToIndex(-4, 8, 10) |  Exception java.lang.IndexOutOfBoundsException: Range [-4, 8) out of bounds for length 10 |        at Preconditions.outOfBounds (Preconditions.java:64) |        at Preconditions.outOfBoundsCheckFromToIndex (Preconditions.java:76) |        at Preconditions.checkFromToIndex (Preconditions.java:295) |        at Objects.checkFromToIndex (Objects.java:398) |        at (#7:1)  jshell&gt; Objects.checkFromToIndex(6, 4, 10) |  Exception java.lang.IndexOutOfBoundsException: Range [6, 4) out of bounds for length 10 |        at Preconditions.outOfBounds (Preconditions.java:64) |        at Preconditions.outOfBoundsCheckFromToIndex (Preconditions.java:76) |        at Preconditions.checkFromToIndex (Preconditions.java:295) |        at Objects.checkFromToIndex (Objects.java:398) |        at (#8:1)<\/code><\/pre>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432 Java 16 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0438 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f <code>long<\/code>:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/16\/docs\/api\/java.base\/java\/util\/Objects.html#checkIndex(long,long)\" rel=\"nofollow noopener noreferrer\"><code>checkIndex(long, long)<\/code><\/a><\/li>\n<li><a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/16\/docs\/api\/java.base\/java\/util\/Objects.html#checkFromIndexSize(long,long,long)\" rel=\"nofollow noopener noreferrer\"><code>checkFromIndexSize(long, long, long)<\/code><\/a><\/li>\n<li><a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/16\/docs\/api\/java.base\/java\/util\/Objects.html#checkFromToIndex(long,long,long)\" rel=\"nofollow noopener noreferrer\"><code>checkFromToIndex(long, long, long)<\/code><\/a><\/li>\n<\/ul>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>  <\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u043f\u0440\u043e 10 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 API, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e <a href=\"https:\/\/habr.com\/ru\/post\/547364\/\">\u0432\u044b\u0448\u0435\u0434\u0448\u0435\u0439 Java 16<\/a>, \u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u043d\u043e \u0435\u0449\u0451 \u0441 9-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u044b \u0441\u0442\u0430\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e Java. \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u0432 \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 Java \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043b\u043e\u043c\u0430\u044e\u0449\u0438\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c (<a href=\"https:\/\/openjdk.java.net\/jeps\/260\" rel=\"nofollow noopener noreferrer\">1<\/a>, <a href=\"https:\/\/openjdk.java.net\/jeps\/322\" rel=\"nofollow noopener noreferrer\">2<\/a>, <a href=\"https:\/\/openjdk.java.net\/jeps\/320\" rel=\"nofollow noopener noreferrer\">3<\/a>, <a href=\"https:\/\/openjdk.java.net\/jeps\/372\" rel=\"nofollow noopener noreferrer\">4<\/a>, <a href=\"https:\/\/openjdk.java.net\/jeps\/396\" rel=\"nofollow noopener noreferrer\">5<\/a>, <a href=\"https:\/\/openjdk.java.net\/jeps\/363\" rel=\"nofollow noopener noreferrer\">6<\/a>, <a href=\"http:\/\/openjdk.java.net\/jeps\/367\" rel=\"nofollow noopener noreferrer\">7<\/a>, <a href=\"http:\/\/openjdk.java.net\/jeps\/403\" rel=\"nofollow noopener noreferrer\">8<\/a>). \u0418 \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u044b \u0442\u044f\u043d\u0435\u0442\u0435 \u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u0441 Java 8 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u0442\u0435\u043c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0432\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442&#8230;<\/p>\n<\/div>\n<p> \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\/post\/554128\/\"> https:\/\/habr.com\/ru\/post\/554128\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<p>\u041a\u0430\u043a\u0438\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 Java? \u041a\u0442\u043e-\u0442\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0438\u0437-\u0437\u0430 \u043d\u043e\u0432\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u0440\u043e\u0434\u0435 <a href=\"https:\/\/openjdk.java.net\/jeps\/361\" rel=\"nofollow noopener noreferrer\"><code>\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 switch<\/code><\/a>, <a href=\"https:\/\/openjdk.java.net\/jeps\/378\" rel=\"nofollow noopener noreferrer\">\u0431\u043b\u043e\u043a\u043e\u0432 \u0442\u0435\u043a\u0441\u0442\u0430<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/openjdk.java.net\/jeps\/395\" rel=\"nofollow noopener noreferrer\">\u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/a>. \u041a\u043e\u043c\u0443-\u0442\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0440\u043e\u0434\u0435 <a href=\"https:\/\/openjdk.java.net\/jeps\/261\" rel=\"nofollow noopener noreferrer\">\u043c\u043e\u0434\u0443\u043b\u0435\u0439<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/openjdk.java.net\/jeps\/379\" rel=\"nofollow noopener noreferrer\">\u043d\u0438\u0437\u043a\u043e\u043f\u0430\u0443\u0437\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u0432 \u043c\u0443\u0441\u043e\u0440\u0430<\/a>. \u041a\u0442\u043e-\u0442\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0432 \u0432\u0435\u0440\u0441\u0438\u044e Java, \u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 <a href=\"https:\/\/openjdk.java.net\/jeps\/341\" rel=\"nofollow noopener noreferrer\">\u0441\u0442\u0430\u043d\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435<\/a> \u0438 \u0431\u0443\u0434\u0435\u0442 <a href=\"https:\/\/openjdk.java.net\/jeps\/254\" rel=\"nofollow noopener noreferrer\">\u0435\u0441\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438<\/a>. \u041d\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0430, \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0432\u0430\u0436\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430. \u042d\u0442\u043e \u043d\u043e\u0432\u044b\u0435 API, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u043a\u043e\u0434\u0430 \u0438 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0442\u0440\u0430\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a \u043d\u0443\u0436\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445. \u0410 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0441\u0434\u0435\u043b\u0430\u044e\u0442 \u0432\u0430\u0448 \u043a\u043e\u0434 \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043f\u043e 10 \u043d\u043e\u0432\u044b\u0445 API, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432 Java 9 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 (<a href=\"https:\/\/habr.com\/ru\/post\/485750\/\">\u0447\u0430\u0441\u0442\u044c 1<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/487636\/\">\u0447\u0430\u0441\u0442\u044c 2<\/a>). \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0451 10.<\/p>\n<p>  <\/p>\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-322011","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/322011","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=322011"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/322011\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=322011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=322011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=322011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}