[ÐопÑоÑÑ Ð´Ð»Ñ ÑобеÑедованиÑ](README.md)
# Java 8
+ [Ðакие нововведениÑ, поÑвилиÑÑ Ð² Java 8 и JDK 8?](#Ðакие-нововведениÑ-поÑвилиÑÑ-в-java-8-и-jdk-8)
+ [ЧÑо Ñакое _«лÑмбда»_? Ðакова ÑÑÑÑкÑÑÑа и оÑобенноÑÑи иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð»Ñмбда-вÑÑажениÑ?](#ЧÑо-Ñакое-лÑмбда-Ðакова-ÑÑÑÑкÑÑÑа-и-оÑобенноÑÑи-иÑполÑзованиÑ-лÑмбда-вÑÑажениÑ)
+ [Ркаким пеÑеменнÑм еÑÑÑ Ð´Ð¾ÑÑÑп Ñ Ð»Ñмбда-вÑÑажений?](#Ð-каким-пеÑеменнÑм-еÑÑÑ-доÑÑÑп-Ñ-лÑмбда-вÑÑажений)
+ [Ðак оÑÑоÑÑиÑоваÑÑ ÑпиÑок ÑÑÑок Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð»Ñмбда-вÑÑажениÑ?](#Ðак-оÑÑоÑÑиÑоваÑÑ-ÑпиÑок-ÑÑÑок-Ñ-помоÑÑÑ-лÑмбда-вÑÑажениÑ)
+ [ЧÑо Ñакое «ÑÑÑлка на меÑод»?](#ЧÑо-Ñакое-ÑÑÑлка-на-меÑод)
+ [Ðакие Ð²Ð¸Ð´Ñ ÑÑÑлок на меÑÐ¾Ð´Ñ Ð²Ñ Ð·Ð½Ð°ÐµÑе?](#Ðакие-видÑ-ÑÑÑлок-на-меÑодÑ-вÑ-знаеÑе)
+ [ÐбÑÑÑниÑе вÑÑажение `System.out::println`.](#ÐбÑÑÑниÑе-вÑÑажение-systemoutprintln)
+ [ЧÑо Ñакое «ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ»?](#ЧÑо-Ñакое-ÑÑнкÑионалÑнÑе-инÑеÑÑейÑÑ)
+ [ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `Function`, `DoubleFunction`, `IntFunction` и `LongFunction`?](#ÐлÑ-Ñего-нÑжнÑ-ÑÑнкÑионалÑнÑе-инÑеÑÑейÑÑ-functiontr-doublefunctionr-intfunctionr-и-longfunctionr)
+ [ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `UnaryOperator`, `DoubleUnaryOperator`, `IntUnaryOperator` и `LongUnaryOperator`?](#ÐлÑ-Ñего-нÑжнÑ-ÑÑнкÑионалÑнÑе-инÑеÑÑейÑÑ-unaryoperatort-doubleunaryoperator-intunaryoperator-и-longunaryoperator)
+ [ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `BinaryOperator`, `DoubleBinaryOperator`, `IntBinaryOperator` и `LongBinaryOperator`?](#ÐлÑ-Ñего-нÑжнÑ-ÑÑнкÑионалÑнÑе-инÑеÑÑейÑÑ-binaryoperatort-doublebinaryoperator-intbinaryoperator-и-longbinaryoperator)
+ [ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `Predicate`, `DoublePredicate`, `IntPredicate` и `LongPredicate`?](#ÐлÑ-Ñего-нÑжнÑ-ÑÑнкÑионалÑнÑе-инÑеÑÑейÑÑ-predicatet-doublepredicate-intpredicate-и-longpredicate)
+ [ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `Consumer`, `DoubleConsumer`, `IntConsumer` и `LongConsumer`?](#ÐлÑ-Ñего-нÑжнÑ-ÑÑнкÑионалÑнÑе-инÑеÑÑейÑÑ-consumert-doubleconsumer-intconsumer-и-longconsumer)
+ [ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `Supplier`, `BooleanSupplier`, `DoubleSupplier`, `IntSupplier` и `LongSupplier`?](#ÐлÑ-Ñего-нÑжнÑ-ÑÑнкÑионалÑнÑе-инÑеÑÑейÑÑ-suppliert--booleansupplier-doublesupplier-intsupplier-и-longsupplier)
+ [ÐÐ»Ñ Ñего нÑжен ÑÑнкÑионалÑнÑй инÑеÑÑÐµÐ¹Ñ `BiConsumer`?](#ÐлÑ-Ñего-нÑжен-ÑÑнкÑионалÑнÑй-инÑеÑÑейÑ-biconsumertu)
+ [ÐÐ»Ñ Ñего нÑжен ÑÑнкÑионалÑнÑй инÑеÑÑÐµÐ¹Ñ `BiFunction`?](#ÐлÑ-Ñего-нÑжен-ÑÑнкÑионалÑнÑй-инÑеÑÑейÑ-bifunctiontur)
+ [ÐÐ»Ñ Ñего нÑжен ÑÑнкÑионалÑнÑй инÑеÑÑÐµÐ¹Ñ `BiPredicate`?](#ÐлÑ-Ñего-нÑжен-ÑÑнкÑионалÑнÑй-инÑеÑÑейÑ-bipredicatetu)
+ [ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ Ð²Ð¸Ð´Ð° `_To_Function`?](#ÐлÑ-Ñего-нÑжнÑ-ÑÑнкÑионалÑнÑе-инÑеÑÑейÑÑ-вида-tofunction)
+ [ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `ToDoubleBiFunction`, `ToIntBiFunction` и `ToLongBiFunction`?](#ÐлÑ-Ñего-нÑжнÑ-ÑÑнкÑионалÑнÑе-инÑеÑÑейÑÑ-todoublebifunctiontu-tointbifunctiontu-и-tolongbifunctiontu)
+ [ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `ToDoubleFunction`, `ToIntFunction` и `ToLongFunction`?](#ÐлÑ-Ñего-нÑжнÑ-ÑÑнкÑионалÑнÑе-инÑеÑÑейÑÑ-todoublefunctiont-tointfunctiont-и-tolongfunctiont)
+ [ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `ObjDoubleConsumer`, `ObjIntConsumer` и `ObjLongConsumer`?](#ÐлÑ-Ñего-нÑжнÑ-ÑÑнкÑионалÑнÑе-инÑеÑÑейÑÑ-objdoubleconsumert-objintconsumert-и-objlongconsumert)
+ [ЧÑо Ñакое `StringJoiner`?](#ЧÑо-Ñакое-stringjoiner)
+ [ЧÑо Ñакое `default` меÑÐ¾Ð´Ñ Ð¸Ð½ÑÑеÑейÑа?](#ЧÑо-Ñакое-default-меÑодÑ-инÑÑеÑейÑа)
+ [Ðак вÑзÑваÑÑ `default` меÑод инÑеÑÑейÑа в ÑеализÑÑÑем ÑÑÐ¾Ñ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ ÐºÐ»Ð°ÑÑе?](#Ðак-вÑзÑваÑÑ-default-меÑод-инÑеÑÑейÑа-в-ÑеализÑÑÑем-ÑÑоÑ-инÑеÑÑейÑ-клаÑÑе)
+ [ЧÑо Ñакое `static` меÑод инÑеÑÑейÑа?](#ЧÑо-Ñакое-static-меÑод-инÑеÑÑейÑа)
+ [Ðак вÑзÑваÑÑ `static` меÑод инÑеÑÑейÑа?](#Ðак-вÑзÑваÑÑ-static-меÑод-инÑеÑÑейÑа)
+ [ЧÑо Ñакое `Optional`?](#ЧÑо-Ñакое-optional)
+ [ЧÑо Ñакое `Stream`?](#ЧÑо-Ñакое-stream)
+ [Ðакие ÑÑÑеÑÑвÑÑÑ ÑпоÑÐ¾Ð±Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑÑима?](#Ðакие-ÑÑÑеÑÑвÑÑÑ-ÑпоÑобÑ-ÑозданиÑ-ÑÑÑима)
+ [Ð Ñем ÑазниÑа Ð¼ÐµÐ¶Ð´Ñ `Collection` и `Stream`?](#Ð-Ñем-ÑазниÑа-междÑ-collection-и-stream)
+ [ÐÐ»Ñ Ñего нÑжен меÑод `collect()` в ÑÑÑимаÑ
?](#ÐлÑ-Ñего-нÑжен-меÑод-collect-в-ÑÑÑимаÑ
)
+ [ÐÐ»Ñ Ñего в ÑÑÑимаÑ
пÑименÑÑÑÑÑ Ð¼ÐµÑÐ¾Ð´Ñ `forEach()` и `forEachOrdered()`?](#ÐлÑ-Ñего-в-ÑÑÑимаÑ
-пÑименÑÑÑÑÑ-меÑодÑ-foreach-и-foreachordered)
+ [ÐÐ»Ñ Ñего в ÑÑÑимаÑ
пÑедназнаÑÐµÐ½Ñ Ð¼ÐµÑÐ¾Ð´Ñ `map()` и `mapToInt()`, `mapToDouble()`, `mapToLong()`?](#ÐлÑ-Ñего-в-ÑÑÑимаÑ
-пÑедназнаÑенÑ-меÑодÑ-map-и-maptoint-maptodouble-maptolong)
+ [Ðакова ÑÐµÐ»Ñ Ð¼ÐµÑода `filter()` в ÑÑÑимаÑ
?](#Ðакова-ÑелÑ-меÑода-filter-в-ÑÑÑимаÑ
)
+ [ÐÐ»Ñ Ñего в ÑÑÑимаÑ
пÑедназнаÑен меÑод `limit()`?](#ÐлÑ-Ñего-в-ÑÑÑимаÑ
-пÑедназнаÑен-меÑод-limit)
+ [ÐÐ»Ñ Ñего в ÑÑÑимаÑ
пÑедназнаÑен меÑод `sorted()`?](#ÐлÑ-Ñего-в-ÑÑÑимаÑ
-пÑедназнаÑен-меÑод-sorted)
+ [ÐÐ»Ñ Ñего в ÑÑÑимаÑ
пÑедназнаÑÐµÐ½Ñ Ð¼ÐµÑÐ¾Ð´Ñ `flatMap()`, `flatMapToInt()`, `flatMapToDouble()`, `flatMapToLong()`?](#ÐлÑ-Ñего-в-ÑÑÑимаÑ
-пÑедназнаÑенÑ-меÑодÑ-flatmap-flatmaptoint-flatmaptodouble-flatmaptolong)
+ [РаÑÑкажиÑе о паÑаллелÑной обÑабоÑке в Java 8.](#РаÑÑкажиÑе-о-паÑаллелÑной-обÑабоÑке-в-java-8)
+ [Ðакие конеÑнÑе меÑÐ¾Ð´Ñ ÑабоÑÑ Ñо ÑÑÑимами Ð²Ñ Ð·Ð½Ð°ÐµÑе?](#Ðакие-конеÑнÑе-меÑодÑ-ÑабоÑÑ-Ñо-ÑÑÑимами-вÑ-знаеÑе)
+ [Ðакие пÑомежÑÑоÑнÑе меÑÐ¾Ð´Ñ ÑабоÑÑ Ñо ÑÑÑимами Ð²Ñ Ð·Ð½Ð°ÐµÑе?](#Ðакие-пÑомежÑÑоÑнÑе-меÑодÑ-ÑабоÑÑ-Ñо-ÑÑÑимами-вÑ-знаеÑе)
+ [Ðак вÑвеÑÑи на ÑкÑан 10 ÑлÑÑайнÑÑ
ÑиÑел, иÑполÑзÑÑ `forEach()`?](#Ðак-вÑвеÑÑи-на-ÑкÑан-10-ÑлÑÑайнÑÑ
-ÑиÑел-иÑполÑзÑÑ-foreach)
+ [Ðак можно вÑвеÑÑи на ÑкÑан ÑникалÑнÑе квадÑаÑÑ ÑиÑел иÑполÑзÑÑ Ð¼ÐµÑод `map()`?](#Ðак-можно-вÑвеÑÑи-на-ÑкÑан-ÑникалÑнÑе-квадÑаÑÑ-ÑиÑел-иÑполÑзÑÑ-меÑод-map)
+ [Ðак вÑвеÑÑи на ÑкÑан колиÑеÑÑво пÑÑÑÑÑ
ÑÑÑок Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÐµÑода `filter()`?](#Ðак-вÑвеÑÑи-на-ÑкÑан-колиÑеÑÑво-пÑÑÑÑÑ
-ÑÑÑок-Ñ-помоÑÑÑ-меÑода-filter)
+ [Ðак вÑвеÑÑи на ÑкÑан 10 ÑлÑÑайнÑÑ
ÑиÑел в поÑÑдке возÑаÑÑаниÑ?](#Ðак-вÑвеÑÑи-на-ÑкÑан-10-ÑлÑÑайнÑÑ
-ÑиÑел-в-поÑÑдке-возÑаÑÑаниÑ)
+ [Ðак найÑи макÑималÑное ÑиÑло в набоÑе?](#Ðак-найÑи-макÑималÑное-ÑиÑло-в-набоÑе)
+ [Ðак найÑи минималÑное ÑиÑло в набоÑе?](#Ðак-найÑи-минималÑное-ÑиÑло-в-набоÑе)
+ [Ðак полÑÑиÑÑ ÑÑÐ¼Ð¼Ñ Ð²ÑеÑ
ÑиÑел в набоÑе?](#Ðак-полÑÑиÑÑ-ÑÑммÑ-вÑеÑ
-ÑиÑел-в-набоÑе)
+ [Ðак полÑÑиÑÑ ÑÑеднее знаÑение вÑеÑ
ÑиÑел?](#Ðак-полÑÑиÑÑ-ÑÑеднее-знаÑение-вÑеÑ
-ÑиÑел)
+ [Ðакие дополниÑелÑнÑе меÑÐ¾Ð´Ñ Ð´Ð»Ñ ÑабоÑÑ Ñ Ð°ÑÑоÑиаÑивнÑми маÑÑивами (maps) поÑвилиÑÑ Ð² Java 8?](#Ðакие-дополниÑелÑнÑе-меÑодÑ-длÑ-ÑабоÑÑ-Ñ-аÑÑоÑиаÑивнÑми-маÑÑивами-maps-поÑвилиÑÑ-в-java-8)
+ [ЧÑо Ñакое `LocalDateTime`?](#ЧÑо-Ñакое-localdatetime)
+ [ЧÑо Ñакое `ZonedDateTime`?](#ЧÑо-Ñакое-zoneddatetime)
+ [Ðак полÑÑиÑÑ ÑекÑÑÑÑ Ð´Ð°ÑÑ Ñ Ð¸ÑполÑзованием Date Time API из Java 8?](#Ðак-полÑÑиÑÑ-ÑекÑÑÑÑ-даÑÑ-Ñ-иÑполÑзованием-date-time-api-из-java-8)
+ [Ðак добавиÑÑ 1 неделÑ, 1 меÑÑÑ, 1 год, 10 Ð»ÐµÑ Ðº ÑекÑÑей даÑе Ñ Ð¸ÑполÑзованием Date Time API?](#Ðак-добавиÑÑ-1-неделÑ-1-меÑÑÑ-1-год-10-леÑ-к-ÑекÑÑей-даÑе-Ñ-иÑполÑзованием-date-time-api)
+ [Ðак полÑÑиÑÑ ÑледÑÑÑий вÑоÑник иÑполÑзÑÑ Date Time API?](#Ðак-полÑÑиÑÑ-ÑледÑÑÑий-вÑоÑник-иÑполÑзÑÑ-date-time-api)
+ [Ðак полÑÑиÑÑ Ð²ÑоÑÑÑ ÑÑббоÑÑ ÑекÑÑего меÑÑÑа иÑполÑзÑÑ Date Time API?](#Ðак-полÑÑиÑÑ-вÑоÑÑÑ-ÑÑббоÑÑ-ÑекÑÑего-меÑÑÑа-иÑполÑзÑÑ-date-time-api)
+ [Ðак полÑÑиÑÑ ÑекÑÑее вÑÐµÐ¼Ñ Ñ ÑоÑноÑÑÑÑ Ð´Ð¾ миллиÑекÑнд иÑполÑзÑÑ Date Time API?](#Ðак-полÑÑиÑÑ-ÑекÑÑее-вÑемÑ-Ñ-ÑоÑноÑÑÑÑ-до-миллиÑекÑнд-иÑполÑзÑÑ-date-time-api)
+ [Ðак полÑÑиÑÑ ÑекÑÑее вÑÐµÐ¼Ñ Ð¿Ð¾ меÑÑÐ½Ð¾Ð¼Ñ Ð²Ñемени Ñ ÑоÑноÑÑÑÑ Ð´Ð¾ миллиÑекÑнд иÑполÑзÑÑ Date Time API?](#Ðак-полÑÑиÑÑ-ÑекÑÑее-вÑемÑ-по-меÑÑномÑ-вÑемени-Ñ-ÑоÑноÑÑÑÑ-до-миллиÑекÑнд-иÑполÑзÑÑ-date-time-api)
+ [Ðак опÑеделиÑÑ Ð¿Ð¾Ð²ÑоÑÑемÑÑ Ð°Ð½Ð½Ð¾ÑаÑиÑ?](#Ðак-опÑеделиÑÑ-повÑоÑÑемÑÑ-анноÑаÑиÑ)
+ [ЧÑо Ñакое `Nashorn`?](#ЧÑо-Ñакое-nashorn)
+ [ЧÑо Ñакое `jjs`?](#ЧÑо-Ñакое-jjs)
+ [Ðакой клаÑÑ Ð¿Ð¾ÑвилÑÑ Ð² Java 8 Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸ÑованиÑ/декодиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
?](#Ðакой-клаÑÑ-поÑвилÑÑ-в-java-8-длÑ-кодиÑованиÑдекодиÑованиÑ-даннÑÑ
)
+ [Ðак ÑоздаÑÑ Base64 кодиÑовÑик и декодиÑовÑик?](#Ðак-ÑоздаÑÑ-base64-кодиÑовÑик-и-декодиÑовÑик)
## Ðакие нововведениÑ, поÑвилиÑÑ Ð² Java 8 и JDK 8?
+ ÐеÑÐ¾Ð´Ñ Ð¸Ð½ÑеÑÑейÑов по ÑмолÑаниÑ;
+ ÐÑмбда-вÑÑажениÑ;
+ ФÑнкÑионалÑнÑе инÑеÑÑейÑÑ;
+ СÑÑлки на меÑÐ¾Ð´Ñ Ð¸ конÑÑÑÑкÑоÑÑ;
+ ÐовÑоÑÑемÑе анноÑаÑии;
+ ÐнноÑаÑии на ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
;
+ РеÑлекÑÐ¸Ñ Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑов меÑодов;
+ _Stream API_ Ð´Ð»Ñ ÑабоÑÑ Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑиÑми;
+ ÐаÑаллелÑÐ½Ð°Ñ ÑоÑÑиÑовка маÑÑивов;
+ Ðовое API Ð´Ð»Ñ ÑабоÑÑ Ñ Ð´Ð°Ñами и вÑеменем;
+ ÐовÑй движок JavaScript _Nashorn_;
+ Ðобавлено неÑколÑко новÑÑ
клаÑÑов Ð´Ð»Ñ Ð¿Ð¾ÑокобезопаÑной ÑабоÑÑ;
+ Ðобавлен новÑй API Ð´Ð»Ñ `Calendar` и `Locale`;
+ Ðобавлена поддеÑжка _Unicode 6.2.0_;
+ Ðобавлен ÑÑандаÑÑнÑй клаÑÑ Ð´Ð»Ñ ÑабоÑÑ Ñ _Base64_;
+ Ðобавлена поддеÑжка беззнаковой аÑиÑмеÑики;
+ УлÑÑÑена пÑоизводиÑелÑноÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа `java.lang.String(byte[], *)` и меÑода `java.lang.String.getBytes()`;
+ ÐÐ¾Ð²Ð°Ñ ÑеализаÑÐ¸Ñ `AccessController.doPrivileged`, позволÑÑÑÐ°Ñ ÑÑÑанавливаÑÑ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑво пÑивилегий без необÑ
одимоÑÑи пÑовеÑки вÑеÑ
оÑÑалÑнÑÑ
ÑÑовней доÑÑÑпа;
+ _Password-based_ алгоÑиÑÐ¼Ñ ÑÑали более ÑÑÑойÑивÑми;
+ Ðобавлена поддеÑжка _SSL/TLS Server Name Indication (NSI)_ в _JSSE Server_;
+ УлÑÑÑено Ñ
ÑанилиÑе клÑÑей (KeyStore);
+ Ðобавлен алгоÑиÑм _SHA-224_;
+ Удален моÑÑ _JDBC - ODBC_;
+ Удален _PermGen_, изменен ÑпоÑоб Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¼ÐµÑа-даннÑÑ
клаÑÑов;
+ ÐозможноÑÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÑоÑилей Ð´Ð»Ñ Ð¿Ð»Ð°ÑÑоÑÐ¼Ñ Java SE, коÑоÑÑе вклÑÑаÑÑ Ð² ÑÐµÐ±Ñ Ð½Ðµ вÑÑ Ð¿Ð»Ð°ÑÑоÑÐ¼Ñ Ñеликом, а некоÑоÑÑÑ ÐµÐµ ÑаÑÑÑ;
+ ÐнÑÑÑÑменÑаÑий
+ Ðобавлена ÑÑилиÑа `jjs` Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ _JavaScript Nashorn_;
+ Ðоманда `java` Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿ÑÑкаÑÑ _JavaFX_ пÑиложениÑ;
+ Ðобавлена ÑÑилиÑа `jdeps` Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° _.class_-Ñайлов.
[к оглавлениÑ](#java-8)
## ЧÑо Ñакое _«лÑмбда»_? Ðакова ÑÑÑÑкÑÑÑа и оÑобенноÑÑи иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð»Ñмбда-вÑÑажениÑ?
__ÐÑмбда__ пÑедÑÑавлÑÐµÑ Ñобой Ð½Ð°Ð±Ð¾Ñ Ð¸Ð½ÑÑÑÑкÑий, коÑоÑÑе можно вÑделиÑÑ Ð² оÑделÑнÑÑ Ð¿ÐµÑеменнÑÑ Ð¸ заÑем многокÑаÑно вÑзваÑÑ Ð² ÑазлиÑнÑÑ
меÑÑаÑ
пÑогÑаммÑ.
ÐÑÐ½Ð¾Ð²Ñ Ð»Ñмбда-вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑоÑÑавлÑÐµÑ _лÑмбда-опеÑаÑоÑ_, коÑоÑÑй пÑедÑÑавлÑÐµÑ ÑÑÑÐµÐ»ÐºÑ `->`. ÐÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ÑазделÑÐµÑ Ð»Ñмбда-вÑÑажение на две ÑаÑÑи: Ð»ÐµÐ²Ð°Ñ ÑаÑÑÑ ÑодеÑÐ¶Ð¸Ñ ÑпиÑок паÑамеÑÑов вÑÑажениÑ, а пÑÐ°Ð²Ð°Ñ ÑобÑÑвенно пÑедÑÑавлÑÐµÑ Ñело лÑмбда-вÑÑажениÑ, где вÑполнÑÑÑÑÑ Ð²Ñе дейÑÑвиÑ.
ÐÑмбда-вÑÑажение не вÑполнÑеÑÑÑ Ñамо по Ñебе, а обÑазÑÐµÑ ÑеализаÑÐ¸Ñ Ð¼ÐµÑода, опÑеделенного в ÑÑнкÑионалÑном инÑеÑÑейÑе. ÐÑи ÑÑом важно, ÑÑо ÑÑнкÑионалÑнÑй инÑеÑÑÐµÐ¹Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑодеÑжаÑÑ ÑолÑко один единÑÑвеннÑй меÑод без ÑеализаÑии.
```java
interface Operationable {
int calculate(int x, int y);
}
public static void main(String[] args) {
Operationable operation = (x, y) -> x + y;
int result = operation.calculate(10, 20);
System.out.println(result); //30
}
```
Ðо ÑакÑÑ Ð»Ñмбда-вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑвлÑÑÑÑÑ Ð² некоÑоÑом Ñоде ÑокÑаÑенной ÑоÑмой внÑÑÑенниÑ
анонимнÑÑ
клаÑÑов, коÑоÑÑе Ñанее пÑименÑлиÑÑ Ð² Java.
+ _ÐÑложенное вÑполнение (deferred execution) лÑмбда-вÑÑажениÑ_- опÑеделÑеÑÑÑ Ð¾Ð´Ð¸Ð½ Ñаз в одном меÑÑе пÑогÑаммÑ, вÑзÑваÑÑÑÑ Ð¿Ñи необÑ
одимоÑÑи, лÑбое колиÑеÑÑво Ñаз и в пÑоизволÑном меÑÑе пÑогÑаммÑ.
+ _ÐаÑамеÑÑÑ Ð»Ñмбда-вÑÑажениÑ_ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑооÑвеÑÑÑвоваÑÑ Ð¿Ð¾ ÑÐ¸Ð¿Ñ Ð¿Ð°ÑамеÑÑам меÑода ÑÑнкÑионалÑного инÑеÑÑейÑа:
```java
operation = (int x, int y) -> x + y;
//ÐÑи напиÑании Ñамого лÑмбда-вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñип паÑамеÑÑов ÑазÑеÑаеÑÑÑ Ð½Ðµ ÑказÑваÑÑ:
(x, y) -> x + y;
//ÐÑли меÑод не пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
паÑамеÑÑов, Ñо пиÑÑÑÑÑ Ð¿ÑÑÑÑе Ñкобки, напÑимеÑ:
() -> 30 + 20;
//ÐÑли меÑод пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑолÑко один паÑамеÑÑ, Ñо Ñкобки можно опÑÑÑиÑÑ:
n -> n * n;
```
+ _ÐонеÑнÑе лÑмбда-вÑÑажениÑ_ не обÑÐ·Ð°Ð½Ñ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ ÐºÐ°ÐºÐ¾Ðµ-либо знаÑение.
```java
interface Printable {
void print(String s);
}
public static void main(String[] args) {
Printable printer = s -> System.out.println(s);
printer.print("Hello, world");
}
```
+ _ÐлоÑнÑе лÑмбда-вÑÑажениÑ_ обÑамлÑÑÑÑÑ ÑигÑÑнÑми Ñкобками. РблоÑнÑÑ
лÑмбда-вÑÑажениÑÑ
можно иÑполÑзоваÑÑ Ð²Ð½ÑÑÑенние вложеннÑе блоки, ÑиклÑ, конÑÑÑÑкÑии `if`, `switch`, ÑоздаваÑÑ Ð¿ÐµÑеменнÑе и Ñ.д. ÐÑли блоÑное лÑмбда-вÑÑажение должно возвÑаÑаÑÑ Ð·Ð½Ð°Ñение, Ñо ÑвнÑм обÑазом пÑименÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ `return`:
```java
Operationable operation = (int x, int y) -> {
if (y == 0) {
return 0;
}
else {
return x / y;
}
};
```
+ _ÐеÑедаÑа лÑмбда-вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² каÑеÑÑве паÑамеÑÑа меÑода_:
```java
interface Condition {
boolean isAppropriate(int n);
}
private static int sum(int[] numbers, Condition condition) {
int result = 0;
for (int i : numbers) {
if (condition.isAppropriate(i)) {
result += i;
}
}
return result;
}
public static void main(String[] args) {
System.out.println(sum(new int[] {0, 1, 0, 3, 0, 5, 0, 7, 0, 9}, (n) -> n != 0));
}
```
[к оглавлениÑ](#java-8)
## Ркаким пеÑеменнÑм еÑÑÑ Ð´Ð¾ÑÑÑп Ñ Ð»Ñмбда-вÑÑажений?
ÐоÑÑÑп к пеÑеменнÑм внеÑней облаÑÑи дейÑÑÐ²Ð¸Ñ Ð¸Ð· лÑмбда-вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¾ÑÐµÐ½Ñ ÑÑ
ож к доÑÑÑÐ¿Ñ Ð¸Ð· анонимнÑÑ
обÑекÑов. Ðожно ÑÑÑлаÑÑÑÑ Ð½Ð°:
+ неизменÑемÑе (_effectively final_ - не обÑзаÑелÑно помеÑеннÑе как `final`) локалÑнÑе пеÑеменнÑе;
+ Ð¿Ð¾Ð»Ñ ÐºÐ»Ð°ÑÑа;
+ ÑÑаÑиÑеÑкие пеÑеменнÑе.
РмеÑодам по ÑмолÑÐ°Ð½Ð¸Ñ ÑеализÑемого ÑÑнкÑионалÑного инÑеÑÑейÑа обÑаÑаÑÑÑÑ Ð²Ð½ÑÑÑи лÑмбда-вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑеÑено.
[к оглавлениÑ](#java-8)
## Ðак оÑÑоÑÑиÑоваÑÑ ÑпиÑок ÑÑÑок Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð»Ñмбда-вÑÑажениÑ?
```java
public static List sort(List list){
Collections.sort(list, (a, b) -> a.compareTo(b));
return list;
}
```
[к оглавлениÑ](#java-8)
## ЧÑо Ñакое «ÑÑÑлка на меÑод»?
ÐÑли ÑÑÑеÑÑвÑÑÑий в клаÑÑе меÑод Ñже Ð´ÐµÐ»Ð°ÐµÑ Ð²Ñе, ÑÑо необÑ
одимо, Ñо можно воÑполÑзоваÑÑÑÑ Ð¼ÐµÑ
анизмом __method reference (ÑÑÑлка на меÑод)__ Ð´Ð»Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенной пеÑедаÑи ÑÑого меÑода. Ð¢Ð°ÐºÐ°Ñ ÑÑÑлка пеÑедаеÑÑÑ Ð² виде:
+ `имÑ_клаÑÑа::имÑ_ÑÑаÑиÑеÑкого_меÑода` Ð´Ð»Ñ ÑÑаÑиÑеÑкого меÑода;
+ `обÑекÑ_клаÑÑа::имÑ_меÑода` Ð´Ð»Ñ Ð¼ÐµÑода ÑкземплÑÑа;
+ `название_клаÑÑа::new` Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа.
РезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð² ÑоÑноÑÑи Ñаким же, как в ÑлÑÑае опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð»Ñмбда-вÑÑажениÑ, коÑоÑое вÑзÑÐ²Ð°ÐµÑ ÑÑÐ¾Ñ Ð¼ÐµÑод.
```java
private interface Measurable {
public int length(String string);
}
public static void main(String[] args) {
Measurable a = String::length;
System.out.println(a.length("abc"));
}
```
СÑÑлки на меÑÐ¾Ð´Ñ Ð¿Ð¾ÑенÑиалÑно более ÑÑÑекÑивнÑ, Ñем иÑполÑзование лÑмбда-вÑÑажений. ÐÑоме Ñого, они пÑедоÑÑавлÑÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑоÑÑ Ð±Ð¾Ð»ÐµÐµ каÑеÑÑвеннÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ Ñипе и пÑи возможноÑÑи вÑбоÑа Ð¼ÐµÐ¶Ð´Ñ Ð¸ÑполÑзованием ÑÑÑлки на ÑÑÑеÑÑвÑÑÑий меÑод и иÑполÑзованием лÑмбда-вÑÑажениÑ, ÑледÑÐµÑ Ð²Ñегда пÑедпоÑиÑаÑÑ Ð¸ÑполÑзование ÑÑÑлки на меÑод.
https://www.examclouds.com/ru/java/java-core-russian/method-references-russian
[к оглавлениÑ](#java-8)
## Ðакие Ð²Ð¸Ð´Ñ ÑÑÑлок на меÑÐ¾Ð´Ñ Ð²Ñ Ð·Ð½Ð°ÐµÑе?
+ на ÑÑаÑиÑеÑкий меÑод;
+ на меÑод ÑкземплÑÑа;
+ на конÑÑÑÑкÑоÑ.
[к оглавлениÑ](#java-8)
## ÐбÑÑÑниÑе вÑÑажение `System.out::println`.
Ðанное вÑÑажение иллÑÑÑÑиÑÑÐµÑ Ð¼ÐµÑ
анизм _instance method reference_: пеÑедаÑи ÑÑÑлки на меÑод `println()` ÑÑаÑиÑеÑкого Ð¿Ð¾Ð»Ñ `out` клаÑÑа `System`.
[к оглавлениÑ](#java-8)
## ЧÑо Ñакое «ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ»?
__ФÑнкÑионалÑнÑй инÑеÑÑейÑ__ - ÑÑо инÑеÑÑейÑ, коÑоÑÑй опÑеделÑÐµÑ ÑолÑко один абÑÑÑакÑнÑй меÑод.
ЧÑÐ¾Ð±Ñ ÑоÑно опÑеделиÑÑ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ ÐºÐ°Ðº ÑÑнкÑионалÑнÑй, добавлена анноÑаÑÐ¸Ñ `@FunctionalInterface`, ÑабоÑаÑÑÐ°Ñ Ð¿Ð¾ пÑинÑÐ¸Ð¿Ñ `@Override`. Ðна обознаÑÐ¸Ñ Ð·Ð°Ð¼ÑÑел и не даÑÑ Ð¾Ð¿ÑеделиÑÑ Ð²ÑоÑой абÑÑÑакÑнÑй меÑод в инÑеÑÑейÑе.
ÐнÑеÑÑÐµÐ¹Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ ÑколÑко Ñгодно `default` меÑодов и пÑи ÑÑом оÑÑаваÑÑÑÑ ÑÑнкÑионалÑнÑм, поÑÐ¾Ð¼Ñ ÑÑо `default` меÑÐ¾Ð´Ñ - не абÑÑÑакÑнÑе.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `Function`, `DoubleFunction`, `IntFunction` и `LongFunction`?
__`Function`__ - инÑеÑÑейÑ, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾ÑоÑого ÑеализÑеÑÑÑ ÑÑнкÑиÑ, полÑÑаÑÑÐ°Ñ Ð½Ð° вÑ
од ÑкземплÑÑ ÐºÐ»Ð°ÑÑа `T` и возвÑаÑаÑÑÐ°Ñ Ð½Ð° вÑÑ
оде ÑкземплÑÑ ÐºÐ»Ð°ÑÑа `R`.
ÐеÑÐ¾Ð´Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ ÑепоÑек вÑзовов (`compose`, `andThen`).
```java
Function toInteger = Integer::valueOf;
Function backToString = toInteger.andThen(String::valueOf);
backToString.apply("123"); // "123"
```
+ `DoubleFunction` - ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð»ÑÑаÑÑÐ°Ñ Ð½Ð° вÑ
од `Double` и возвÑаÑаÑÑÐ°Ñ Ð½Ð° вÑÑ
оде ÑкземплÑÑ ÐºÐ»Ð°ÑÑа `R`;
+ `IntFunction` - ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð»ÑÑаÑÑÐ°Ñ Ð½Ð° вÑ
од `Integer` и возвÑаÑаÑÑÐ°Ñ Ð½Ð° вÑÑ
оде ÑкземплÑÑ ÐºÐ»Ð°ÑÑа `R`;
+ `LongFunction` - ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð»ÑÑаÑÑÐ°Ñ Ð½Ð° вÑ
од `Long` и возвÑаÑаÑÑÐ°Ñ Ð½Ð° вÑÑ
оде ÑкземплÑÑ ÐºÐ»Ð°ÑÑа `R`.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `UnaryOperator`, `DoubleUnaryOperator`, `IntUnaryOperator` и `LongUnaryOperator`?
__`UnaryOperator` (ÑнаÑнÑй опеÑаÑоÑ)__ пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² каÑеÑÑве паÑамеÑÑа обÑÐµÐºÑ Ñипа `T`, вÑполнÑÐµÑ Ð½Ð°Ð´ ними опеÑаÑии и возвÑаÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑий в виде обÑекÑа Ñипа `T`:
```java
UnaryOperator operator = x -> x * x;
System.out.println(operator.apply(5)); // 25
```
+ `DoubleUnaryOperator` - ÑнаÑнÑй опеÑаÑÐ¾Ñ Ð¿Ð¾Ð»ÑÑаÑÑий на вÑ
од `Double`;
+ `IntUnaryOperator` - ÑнаÑнÑй опеÑаÑÐ¾Ñ Ð¿Ð¾Ð»ÑÑаÑÑий на вÑ
од `Integer`;
+ `LongUnaryOperator` - ÑнаÑнÑй опеÑаÑÐ¾Ñ Ð¿Ð¾Ð»ÑÑаÑÑий на вÑ
од `Long`.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `BinaryOperator`, `DoubleBinaryOperator`, `IntBinaryOperator` и `LongBinaryOperator`?
__`BinaryOperator` (бинаÑнÑй опеÑаÑоÑ)__ - инÑеÑÑейÑ, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾ÑоÑого ÑеализÑеÑÑÑ ÑÑнкÑиÑ, полÑÑаÑÑÐ°Ñ Ð½Ð° вÑ
од два ÑкземплÑÑа клаÑÑа `T` и возвÑаÑаÑÑÐ°Ñ Ð½Ð° вÑÑ
оде ÑкземплÑÑ ÐºÐ»Ð°ÑÑа `T`.
```java
BinaryOperator operator = (a, b) -> a + b;
System.out.println(operator.apply(1, 2)); // 3
```
+ `DoubleBinaryOperator` - бинаÑнÑй опеÑаÑÐ¾Ñ Ð¿Ð¾Ð»ÑÑаÑÑий на вÑ
од `Double`;
+ `IntBinaryOperator` - бинаÑнÑй опеÑаÑÐ¾Ñ Ð¿Ð¾Ð»ÑÑаÑÑий на вÑ
од `Integer`;
+ `LongBinaryOperator` - бинаÑнÑй опеÑаÑÐ¾Ñ Ð¿Ð¾Ð»ÑÑаÑÑий на вÑ
од `Long`.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `Predicate`, `DoublePredicate`, `IntPredicate` и `LongPredicate`?
__`Predicate` (пÑедикаÑ)__ - инÑеÑÑейÑ, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾ÑоÑого ÑеализÑеÑÑÑ ÑÑнкÑиÑ, полÑÑаÑÑÐ°Ñ Ð½Ð° вÑ
од ÑкземплÑÑ ÐºÐ»Ð°ÑÑа `T` и возвÑаÑаÑÑÐ°Ñ Ð½Ð° вÑÑ
оде знаÑение Ñипа `boolean`.
ÐнÑеÑÑÐµÐ¹Ñ ÑодеÑÐ¶Ð¸Ñ ÑазлиÑнÑе меÑÐ¾Ð´Ñ Ð¿Ð¾ ÑмолÑаниÑ, позволÑÑÑие ÑÑÑоиÑÑ ÑложнÑе ÑÑÐ»Ð¾Ð²Ð¸Ñ (`and`, `or`, `negate`).
```java
Predicate predicate = (s) -> s.length() > 0;
predicate.test("foo"); // true
predicate.negate().test("foo"); // false
```
+ `DoublePredicate` - пÑÐµÐ´Ð¸ÐºÐ°Ñ Ð¿Ð¾Ð»ÑÑаÑÑий на вÑ
од `Double`;
+ `IntPredicate` - пÑÐµÐ´Ð¸ÐºÐ°Ñ Ð¿Ð¾Ð»ÑÑаÑÑий на вÑ
од `Integer`;
+ `LongPredicate` - пÑÐµÐ´Ð¸ÐºÐ°Ñ Ð¿Ð¾Ð»ÑÑаÑÑий на вÑ
од `Long`.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `Consumer`, `DoubleConsumer`, `IntConsumer` и `LongConsumer`?
__`Consumer` (поÑÑебиÑелÑ)__ - инÑеÑÑейÑ, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾ÑоÑого ÑеализÑеÑÑÑ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð½Ð° вÑ
од ÑкземплÑÑ ÐºÐ»Ð°ÑÑа `T`, пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ Ñ Ð½Ð¸Ð¼ некоÑоÑое дейÑÑвие и ниÑего не возвÑаÑаеÑ.
```java
Consumer hello = (name) -> System.out.println("Hello, " + name);
hello.accept("world");
```
+ `DoubleConsumer` - поÑÑебиÑÐµÐ»Ñ Ð¿Ð¾Ð»ÑÑаÑÑий на вÑ
од `Double`;
+ `IntConsumer` - поÑÑебиÑÐµÐ»Ñ Ð¿Ð¾Ð»ÑÑаÑÑий на вÑ
од `Integer`;
+ `LongConsumer` - поÑÑебиÑÐµÐ»Ñ Ð¿Ð¾Ð»ÑÑаÑÑий на вÑ
од `Long`.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `Supplier`, `BooleanSupplier`, `DoubleSupplier`, `IntSupplier` и `LongSupplier`?
__`Supplier` (поÑÑавÑик)__ - инÑеÑÑейÑ, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾ÑоÑого ÑеализÑеÑÑÑ ÑÑнкÑиÑ, ниÑего не пÑинимаÑÑÐ°Ñ Ð½Ð° вÑ
од, но возвÑаÑаÑÑÐ°Ñ Ð½Ð° вÑÑ
од ÑезÑлÑÑÐ°Ñ ÐºÐ»Ð°ÑÑа `T`;
```java
Supplier now = LocalDateTime::now;
now.get();
```
+ `DoubleSupplier` - поÑÑавÑик возвÑаÑаÑÑий `Double`;
+ `IntSupplier` - поÑÑавÑик возвÑаÑаÑÑий `Integer`;
+ `LongSupplier` - поÑÑавÑик возвÑаÑаÑÑий `Long`.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего нÑжен ÑÑнкÑионалÑнÑй инÑеÑÑÐµÐ¹Ñ `BiConsumer`?
__`BiConsumer`__ пÑедÑÑавлÑÐµÑ Ñобой опеÑаÑиÑ, коÑоÑÐ°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð´Ð²Ð° аÑгÑменÑа клаÑÑов `T` и `U` пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ Ñ Ð½Ð¸Ð¼Ð¸ некоÑоÑое дейÑÑвие и ниÑего не возвÑаÑаеÑ.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего нÑжен ÑÑнкÑионалÑнÑй инÑеÑÑÐµÐ¹Ñ `BiFunction`?
__`BiFunction`__ пÑедÑÑавлÑÐµÑ Ñобой опеÑаÑиÑ, коÑоÑÐ°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð´Ð²Ð° аÑгÑменÑа клаÑÑов `T` и `U` и возвÑаÑаÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ ÐºÐ»Ð°ÑÑа `R`.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего нÑжен ÑÑнкÑионалÑнÑй инÑеÑÑÐµÐ¹Ñ `BiPredicate`?
__`BiPredicate`__ пÑедÑÑавлÑÐµÑ Ñобой опеÑаÑиÑ, коÑоÑÐ°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð´Ð²Ð° аÑгÑменÑа клаÑÑов `T` и `U` и возвÑаÑаÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ Ñипа `boolean`.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ Ð²Ð¸Ð´Ð° `_To_Function`?
+ `DoubleToIntFunction` - опеÑаÑÐ¸Ñ Ð¿ÑинимаÑÑÐ°Ñ Ð°ÑгÑÐ¼ÐµÐ½Ñ ÐºÐ»Ð°ÑÑа `Double` и возвÑаÑаÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ Ñипа `Integer`;
+ `DoubleToLongFunction` - опеÑаÑÐ¸Ñ Ð¿ÑинимаÑÑÐ°Ñ Ð°ÑгÑÐ¼ÐµÐ½Ñ ÐºÐ»Ð°ÑÑа `Double` и возвÑаÑаÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ Ñипа `Long`;
+ `IntToDoubleFunction` - опеÑаÑÐ¸Ñ Ð¿ÑинимаÑÑÐ°Ñ Ð°ÑгÑÐ¼ÐµÐ½Ñ ÐºÐ»Ð°ÑÑа `Integer` и возвÑаÑаÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ Ñипа `Double`;
+ `IntToLongFunction` - опеÑаÑÐ¸Ñ Ð¿ÑинимаÑÑÐ°Ñ Ð°ÑгÑÐ¼ÐµÐ½Ñ ÐºÐ»Ð°ÑÑа `Integer` и возвÑаÑаÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ Ñипа `Long`;
+ `LongToDoubleFunction` - опеÑаÑÐ¸Ñ Ð¿ÑинимаÑÑÐ°Ñ Ð°ÑгÑÐ¼ÐµÐ½Ñ ÐºÐ»Ð°ÑÑа `Long` и возвÑаÑаÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ Ñипа `Double`;
+ `LongToIntFunction` - опеÑаÑÐ¸Ñ Ð¿ÑинимаÑÑÐ°Ñ Ð°ÑгÑÐ¼ÐµÐ½Ñ ÐºÐ»Ð°ÑÑа `Long` и возвÑаÑаÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ Ñипа `Integer`.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `ToDoubleBiFunction`, `ToIntBiFunction` и `ToLongBiFunction`?
+ `ToDoubleBiFunction` - опеÑаÑÐ¸Ñ Ð¿ÑинимаÑÑÐ°Ñ Ð´Ð²Ð° аÑгÑменÑа клаÑÑов `T` и `U` и возвÑаÑаÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ Ñипа `Double`;
+ `ToLongBiFunction` - опеÑаÑÐ¸Ñ Ð¿ÑинимаÑÑÐ°Ñ Ð´Ð²Ð° аÑгÑменÑа клаÑÑов `T` и `U` и возвÑаÑаÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ Ñипа `Long`;
+ `ToIntBiFunction` - опеÑаÑÐ¸Ñ Ð¿ÑинимаÑÑÐ°Ñ Ð´Ð²Ð° аÑгÑменÑа клаÑÑов `T` и `U` и возвÑаÑаÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ Ñипа `Integer`.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `ToDoubleFunction`, `ToIntFunction` и `ToLongFunction`?
+ `ToDoubleFunction` - опеÑаÑÐ¸Ñ Ð¿ÑинимаÑÑÐ°Ñ Ð°ÑгÑÐ¼ÐµÐ½Ñ ÐºÐ»Ð°ÑÑа `T` и возвÑаÑаÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ Ñипа `Double`;
+ `ToLongFunction` - опеÑаÑÐ¸Ñ Ð¿ÑинимаÑÑÐ°Ñ Ð°ÑгÑÐ¼ÐµÐ½Ñ ÐºÐ»Ð°ÑÑа `T` и возвÑаÑаÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ Ñипа `Long`;
+ `ToIntFunction` - опеÑаÑÐ¸Ñ Ð¿ÑинимаÑÑÐ°Ñ Ð°ÑгÑÐ¼ÐµÐ½Ñ ÐºÐ»Ð°ÑÑа `T` и возвÑаÑаÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ Ñипа `Integer`.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего нÑÐ¶Ð½Ñ ÑÑнкÑионалÑнÑе инÑеÑÑейÑÑ `ObjDoubleConsumer`, `ObjIntConsumer` и `ObjLongConsumer`?
+ `ObjDoubleConsumer` - опеÑаÑиÑ, коÑоÑÐ°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð´Ð²Ð° аÑгÑменÑа клаÑÑов `T` и `Double`, пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ Ñ Ð½Ð¸Ð¼Ð¸ некоÑоÑое дейÑÑвие и ниÑего не возвÑаÑаеÑ;
+ `ObjLongConsumer` - опеÑаÑиÑ, коÑоÑÐ°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð´Ð²Ð° аÑгÑменÑа клаÑÑов `T` и `Long`, пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ Ñ Ð½Ð¸Ð¼Ð¸ некоÑоÑое дейÑÑвие и ниÑего не возвÑаÑаеÑ;
+ `ObjIntConsumer` - опеÑаÑиÑ, коÑоÑÐ°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð´Ð²Ð° аÑгÑменÑа клаÑÑов `T` и `Integer`, пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ Ñ Ð½Ð¸Ð¼Ð¸ некоÑоÑое дейÑÑвие и ниÑего не возвÑаÑаеÑ.
[к оглавлениÑ](#java-8)
## ЧÑо Ñакое `StringJoiner`?
ÐлаÑÑ `StringJoiner` иÑполÑзÑеÑÑÑ, ÑÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ ÑÑÑок, ÑазделеннÑÑ
ÑазделиÑелем Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑÑ Ð¿ÑиÑоединиÑÑ Ðº полÑÑенной ÑÑÑоке пÑеÑÐ¸ÐºÑ Ð¸ ÑÑÑÑикÑ:
```java
StringJoiner joiner = new StringJoiner(".", "prefix-", "-suffix");
for (String s : "Hello the brave world".split(" ")) {
joiner.add(s);
}
System.out.println(joiner); //prefix-Hello.the.brave.world-suffix
```
[к оглавлениÑ](#java-8)
## ЧÑо Ñакое `default` меÑÐ¾Ð´Ñ Ð¸Ð½ÑÑеÑейÑа?
Java 8 позволÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ Ð½ÐµÐ°Ð±ÑÑÑакÑнÑе ÑеализаÑии меÑодов в инÑеÑÑейÑ, иÑполÑзÑÑ ÐºÐ»ÑÑевое Ñлово `default`:
```java
interface Example {
int process(int a);
default void show() {
System.out.println("default show()");
}
}
```
+ ÐÑли клаÑÑ ÑеализÑÐµÑ Ð¸Ð½ÑеÑÑейÑ, он можеÑ, но не обÑзан, ÑеализоваÑÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð¿Ð¾-ÑмолÑаниÑ, Ñже ÑеализованнÑе в инÑеÑÑейÑе. ÐлаÑÑ Ð½Ð°ÑледÑÐµÑ ÑеализаÑÐ¸Ñ Ð¿Ð¾ ÑмолÑаниÑ.
+ ÐÑли некий клаÑÑ ÑеализÑÐµÑ Ð½ÐµÑколÑко инÑеÑÑейÑов, коÑоÑÑе имеÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñй меÑод по ÑмолÑаниÑ, Ñо клаÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑеализоваÑÑ Ð¼ÐµÑод Ñ ÑовпадаÑÑей ÑигнаÑÑÑой ÑамоÑÑоÑÑелÑно. СиÑÑаÑÐ¸Ñ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñна, еÑли один инÑеÑÑÐµÐ¹Ñ Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑод по ÑмолÑаниÑ, а в дÑÑгом ÑÑÐ¾Ñ Ð¶Ðµ меÑод ÑвлÑеÑÑÑ Ð°Ð±ÑÑÑакÑнÑм - никакой ÑеализаÑии по ÑмолÑÐ°Ð½Ð¸Ñ ÐºÐ»Ð°ÑÑом не наÑледÑеÑÑÑ.
+ ÐеÑод по ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑеопÑеделиÑÑ Ð¼ÐµÑод клаÑÑа `java.lang.Object`.
+ ÐомогаÑÑ ÑеализовÑваÑÑ Ð¸Ð½ÑеÑÑейÑÑ Ð±ÐµÐ· ÑÑÑаÑ
а наÑÑÑиÑÑ ÑабоÑÑ Ð´ÑÑгиÑ
клаÑÑов.
+ ÐозволÑÑÑ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑлÑжебнÑÑ
клаÑÑов, Ñак как вÑе необÑ
одимÑе меÑÐ¾Ð´Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² ÑамиÑ
инÑеÑÑейÑаÑ
.
+ ÐаÑÑ ÑÐ²Ð¾Ð±Ð¾Ð´Ñ ÐºÐ»Ð°ÑÑам вÑбÑаÑÑ Ð¼ÐµÑод, коÑоÑÑй нÑжно пеÑеопÑеделиÑÑ.
+ Ðдной из оÑновнÑÑ
пÑиÑин внедÑÐµÐ½Ð¸Ñ Ð¼ÐµÑодов по ÑмолÑÐ°Ð½Ð¸Ñ ÑвлÑеÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÐºÐ¾Ð»Ð»ÐµÐºÑий в Java 8 иÑполÑзоваÑÑ Ð»Ñмбда-вÑÑажениÑ.
[к оглавлениÑ](#java-8)
## Ðак вÑзÑваÑÑ `default` меÑод инÑеÑÑейÑа в ÑеализÑÑÑем ÑÑÐ¾Ñ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ ÐºÐ»Ð°ÑÑе?
ÐÑполÑзÑÑ ÐºÐ»ÑÑевое Ñлово `super` вмеÑÑе Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ инÑеÑÑейÑа:
```java
interface Paper {
default void show() {
System.out.println("default show()");
}
}
class Licence implements Paper {
public void show() {
Paper.super.show();
}
}
```
[к оглавлениÑ](#java-8)
## ЧÑо Ñакое `static` меÑод инÑеÑÑейÑа?
СÑаÑиÑеÑкие меÑÐ¾Ð´Ñ Ð¸Ð½ÑеÑÑейÑа поÑ
ожи на меÑÐ¾Ð´Ñ Ð¿Ð¾ ÑмолÑаниÑ, за иÑклÑÑением Ñого, ÑÑо Ð´Ð»Ñ Ð½Ð¸Ñ
оÑÑÑÑÑÑвÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¿ÐµÑеопÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð² клаÑÑаÑ
, ÑеализÑÑÑиÑ
инÑеÑÑейÑ.
+ СÑаÑиÑеÑкие меÑÐ¾Ð´Ñ Ð² инÑеÑÑейÑе ÑвлÑÑÑÑÑ ÑаÑÑÑÑ Ð¸Ð½ÑеÑÑейÑа без возможноÑÑи иÑполÑзоваÑÑ Ð¸Ñ
Ð´Ð»Ñ Ð¾Ð±ÑекÑов клаÑÑа ÑеализаÑии;
+ ÐеÑÐ¾Ð´Ñ ÐºÐ»Ð°ÑÑа `java.lang.Object` нелÑÐ·Ñ Ð¿ÐµÑеопÑеделиÑÑ ÐºÐ°Ðº ÑÑаÑиÑеÑкие;
+ СÑаÑиÑеÑкие меÑÐ¾Ð´Ñ Ð² инÑеÑÑейÑе иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ Ð²ÑпомогаÑелÑнÑÑ
меÑодов, напÑимеÑ, пÑовеÑки на null, ÑоÑÑиÑовки коллекÑий и Ñ.д.
[к оглавлениÑ](#java-8)
## Ðак вÑзÑваÑÑ `static` меÑод инÑеÑÑейÑа?
ÐÑполÑзÑÑ Ð¸Ð¼Ñ Ð¸Ð½ÑеÑÑейÑа:
```java
interface Paper {
static void show() {
System.out.println("static show()");
}
}
class Licence {
public void showPaper() {
Paper.show();
}
}
```
[к оглавлениÑ](#java-8)
## ЧÑо Ñакое `Optional`?
ÐпÑионалÑное знаÑение `Optional` â ÑÑо конÑÐµÐ¹Ð½ÐµÑ Ð´Ð»Ñ Ð¾Ð±ÑекÑа, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¸Ð»Ð¸ не ÑодеÑжаÑÑ Ð·Ð½Ð°Ñение `null`. Ð¢Ð°ÐºÐ°Ñ Ð¾Ð±ÑÑÑка ÑвлÑеÑÑÑ ÑдобнÑм ÑÑедÑÑвом пÑедоÑвÑаÑÐµÐ½Ð¸Ñ `NullPointerException`, Ñ.к.
Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑе ÑÑнкÑии вÑÑÑего поÑÑдка, избавлÑÑÑие Ð¾Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð²ÑоÑÑÑÑиÑ
ÑÑ `if null/notNull` пÑовеÑок:
```java
Optional optional = Optional.of("hello");
optional.isPresent(); // true
optional.ifPresent(s -> System.out.println(s.length())); // 5
optional.get(); // "hello"
optional.orElse("ops..."); // "hello"
```
[к оглавлениÑ](#java-8)
## ЧÑо Ñакое `Stream`?
ÐнÑеÑÑÐµÐ¹Ñ `java.util.Stream` пÑедÑÑавлÑÐµÑ Ñобой поÑледоваÑелÑноÑÑÑ ÑлеменÑов, над коÑоÑой можно пÑоизводиÑÑ ÑазлиÑнÑе опеÑаÑии.
ÐпеÑаÑии над ÑÑÑимами бÑваÑÑ Ð¸Ð»Ð¸ _пÑомежÑÑоÑнÑми (intermediate)_ или _конеÑнÑми (terminal)_. ÐонеÑнÑе опеÑаÑии возвÑаÑаÑÑ ÑезÑлÑÑÐ°Ñ Ð¾Ð¿Ñеделенного Ñипа, а пÑомежÑÑоÑнÑе опеÑаÑии возвÑаÑаÑÑ ÑÐ¾Ñ Ð¶Ðµ ÑÑÑим. Таким обÑазом Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑÑÑоиÑÑ ÑепоÑки из неÑколÑко опеÑаÑий над одним и Ñем же ÑÑÑимом.
У ÑÑÑима Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑколÑко Ñгодно вÑзовов пÑомежÑÑоÑнÑÑ
опеÑаÑий и поÑледним вÑзов конеÑной опеÑаÑии. ÐÑи ÑÑом вÑе пÑомежÑÑоÑнÑе опеÑаÑии вÑполнÑÑÑÑÑ Ð»ÐµÐ½Ð¸Ð²Ð¾ и пока не бÑÐ´ÐµÑ Ð²Ñзвана конеÑÐ½Ð°Ñ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
дейÑÑвий на Ñамом деле не пÑоиÑÑ
Ð¾Ð´Ð¸Ñ (поÑ
оже на Ñоздание обÑекÑа `Thread` или `Runnable`, без вÑзова `start()`).
СÑÑÐ¸Ð¼Ñ ÑоздаÑÑÑÑ Ð½Ð° оÑнове иÑÑоÑников какиÑ
-либо, напÑÐ¸Ð¼ÐµÑ ÐºÐ»Ð°ÑÑов из `java.util.Collection`.
ÐÑÑоÑиаÑивнÑе маÑÑÐ¸Ð²Ñ (maps), напÑÐ¸Ð¼ÐµÑ `HashMap`, не поддеÑживаÑÑÑÑ.
ÐпеÑаÑии над ÑÑÑимами могÑÑ Ð²ÑполнÑÑÑÑÑ ÐºÐ°Ðº поÑледоваÑелÑно, Ñак и паÑаллелÑно.
ÐоÑоки не могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð¿Ð¾Ð²ÑоÑно. Ðак ÑолÑко бÑла вÑзвана какаÑ-нибÑÐ´Ñ ÐºÐ¾Ð½ÐµÑÐ½Ð°Ñ Ð¾Ð¿ÐµÑаÑиÑ, поÑок закÑÑваеÑÑÑ.
ÐÑоме ÑнивеÑÑалÑнÑÑ
обÑекÑнÑÑ
ÑÑÑеÑÑвÑÑÑ Ð¾ÑобÑе Ð²Ð¸Ð´Ñ ÑÑÑимов Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¿ÑимиÑивнÑми Ñипами даннÑÑ
`int`, `long` и `double`: `IntStream`, `LongStream` и `DoubleStream`. ÐÑи пÑимиÑивнÑе ÑÑÑÐ¸Ð¼Ñ ÑабоÑаÑÑ Ñак же, как и обÑÑнÑе обÑекÑнÑе, но Ñо ÑледÑÑÑими оÑлиÑиÑми:
+ иÑполÑзÑÑÑ ÑпеÑиализиÑованнÑе лÑмбда-вÑÑажениÑ, напÑÐ¸Ð¼ÐµÑ `IntFunction` или `IntPredicate` вмеÑÑо `Function` и `Predicate`;
+ поддеÑживаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе конеÑнÑе опеÑаÑии `sum()`, `average()`, `mapToObj()`.
[к оглавлениÑ](#java-8)
## Ðакие ÑÑÑеÑÑвÑÑÑ ÑпоÑÐ¾Ð±Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑÑима?
1. Ðз коллекÑии:
```java
Stream fromCollection = Arrays.asList("x", "y", "z").stream();
```
2. Ðз набоÑа знаÑений:
```java
Stream fromValues = Stream.of("x", "y", "z");
```
3. Ðз маÑÑива:
```java
Stream fromArray = Arrays.stream(new String[]{"x", "y", "z"});
```
4. Ðз Ñайла (ÐºÐ°Ð¶Ð´Ð°Ñ ÑÑÑока в Ñайле бÑÐ´ÐµÑ Ð¾ÑделÑнÑм ÑлеменÑом в ÑÑÑиме):
```java
Stream fromFile = Files.lines(Paths.get("input.txt"));
```
5. Ðз ÑÑÑоки:
```java
IntStream fromString = "0123456789".chars();
```
6. С помоÑÑÑ `Stream.builder()`:
```java
Stream fromBuilder = Stream.builder().add("z").add("y").add("z").build();
```
7. С помоÑÑÑ `Stream.iterate()` (беÑконеÑнÑй):
```java
Stream fromIterate = Stream.iterate(1, n -> n + 1);
```
8. С помоÑÑÑ `Stream.generate()` (беÑконеÑнÑй):
```java
Stream fromGenerate = Stream.generate(() -> "0");
```
[к оглавлениÑ](#java-8)
## Ð Ñем ÑазниÑа Ð¼ÐµÐ¶Ð´Ñ `Collection` и `Stream`?
ÐоллекÑии позволÑÑÑ ÑабоÑаÑÑ Ñ ÑлеменÑами по-оÑделÑноÑÑи, Ñогда как ÑÑÑÐ¸Ð¼Ñ Ñак делаÑÑ Ð½Ðµ позволÑÑÑ, но вмеÑÑо ÑÑого пÑедоÑÑавлÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²ÑполнÑÑÑ ÑÑнкÑии над даннÑми как над одним ÑелÑм.
Также ÑÑÐ¾Ð¸Ñ Ð¾ÑмеÑиÑÑ Ð²Ð°Ð¶Ð½Ð¾ÑÑÑ Ñамой конÑепÑии ÑÑÑноÑÑей: `Collection` - ÑÑо пÑежде вÑего воплоÑение _СÑÑÑкÑÑÑÑ ÐаннÑÑ
_. ÐапÑÐ¸Ð¼ÐµÑ `Set` не пÑоÑÑо Ñ
ÑÐ°Ð½Ð¸Ñ Ð² Ñебе ÑлеменÑÑ, он ÑеализÑÐµÑ Ð¸Ð´ÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑва Ñ ÑникалÑнÑми ÑлеменÑами,
Ñогда как `Stream`, ÑÑо пÑежде вÑего абÑÑÑакÑÐ¸Ñ Ð½ÐµÐ¾Ð±Ñ
Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð´Ð»Ñ ÑеализаÑии _конвееÑа вÑÑиÑлений_, ÑобÑÑвенно поÑÑомÑ, ÑезÑлÑÑаÑом ÑабоÑÑ ÐºÐ¾Ð½Ð²ÐµÐµÑа ÑвлÑÑÑÑÑ Ñе или инÑе _СÑÑÑкÑÑÑÑ ÐаннÑÑ
_ или же ÑезÑлÑÑаÑÑ Ð¿ÑовеÑок/поиÑка и Ñ.п.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего нÑжен меÑод `collect()` в ÑÑÑимаÑ
?
ÐеÑод `collect()` ÑвлÑеÑÑÑ ÐºÐ¾Ð½ÐµÑной опеÑаÑией, коÑоÑÐ°Ñ Ð¸ÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÑедÑÑавление ÑезÑлÑÑаÑа в виде коллекÑии или какой-либо дÑÑгой ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ
.
`collect()` пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð½Ð° вÑ
од `Collector<Тип_иÑÑоÑника, Тип_аккÑмÑлÑÑоÑа, Тип_ÑезÑлÑÑаÑа>`, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ ÑеÑÑÑе ÑÑапа: _supplier_ - иниÑиализаÑÐ¸Ñ Ð°ÐºÐºÑмÑлÑÑоÑа, _accumulator_ - обÑабоÑка каждого ÑлеменÑа, _combiner_ - Ñоединение двÑÑ
аккÑмÑлÑÑоÑов пÑи паÑаллелÑном вÑполнении, _[finisher]_ - необÑзаÑелÑнÑй меÑод поÑледней обÑабоÑки аккÑмÑлÑÑоÑа. Ð Java 8 в клаÑÑе `Collectors` Ñеализовано неÑколÑко ÑаÑпÑоÑÑÑанÑннÑÑ
коллекÑоÑов:
+ `toList()`, `toCollection()`, `toSet()` - пÑедÑÑавлÑÑÑ ÑÑÑим в виде ÑпиÑка, коллекÑии или множеÑÑва;
+ `toConcurrentMap()`, `toMap()` - позволÑÑÑ Ð¿ÑеобÑазоваÑÑ ÑÑÑим в `Map`;
+ `averagingInt()`, `averagingDouble()`, `averagingLong()` - возвÑаÑаÑÑ ÑÑеднее знаÑение;
+ `summingInt()`, `summingDouble()`, `summingLong()` - возвÑаÑÐ°ÐµÑ ÑÑммÑ;
+ `summarizingInt()`, `summarizingDouble()`, `summarizingLong()` - возвÑаÑаÑÑ `SummaryStatistics` Ñ ÑазнÑми агÑегаÑнÑми знаÑениÑми;
+ `partitioningBy()` - ÑазделÑÐµÑ ÐºÐ¾Ð»Ð»ÐµÐºÑÐ¸Ñ Ð½Ð° две ÑаÑÑи по ÑооÑвеÑÑÑÐ²Ð¸Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ возвÑаÑÐ°ÐµÑ Ð¸Ñ
как `Map`;
+ `groupingBy()` - ÑазделÑÐµÑ ÐºÐ¾Ð»Ð»ÐµÐºÑÐ¸Ñ Ð½Ð° неÑколÑко ÑаÑÑей и возвÑаÑÐ°ÐµÑ `Map>`;
+ `mapping()` - дополниÑелÑнÑе пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð½Ð°Ñений Ð´Ð»Ñ ÑложнÑÑ
`Collector`-ов.
Так же ÑÑÑеÑÑвÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑобÑÑвенного коллекÑоÑа ÑеÑез `Collector.of()`:
```java
Collector, List> toList = Collector.of(
ArrayList::new,
List::add,
(l1, l2) -> { l1.addAll(l2); return l1; }
);
```
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего в ÑÑÑимаÑ
пÑименÑÑÑÑÑ Ð¼ÐµÑÐ¾Ð´Ñ `forEach()` и `forEachOrdered()`?
+ `forEach()` пÑименÑÐµÑ ÑÑнкÑÐ¸Ñ Ðº ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ ÑÑÑима, поÑÑдок пÑи паÑаллелÑном вÑполнении не гаÑанÑиÑÑеÑÑÑ;
+ `forEachOrdered()` пÑименÑÐµÑ ÑÑнкÑÐ¸Ñ Ðº ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ ÑÑÑима Ñ ÑоÑ
Ñанением поÑÑдка ÑлеменÑов.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего в ÑÑÑимаÑ
пÑедназнаÑÐµÐ½Ñ Ð¼ÐµÑÐ¾Ð´Ñ `map()` и `mapToInt()`, `mapToDouble()`, `mapToLong()`?
ÐеÑод `map()` ÑвлÑеÑÑÑ Ð¿ÑомежÑÑоÑной опеÑаÑией, коÑоÑÐ°Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм обÑазом пÑеобÑазÑÐµÑ ÐºÐ°Ð¶Ð´Ñй ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑÑÑима.
`mapToInt()`, `mapToDouble()`, `mapToLong()` - аналоги `map()`, возвÑаÑаÑÑие ÑооÑвеÑÑÑвÑÑÑий ÑиÑловой ÑÑÑим (Ñо еÑÑÑ ÑÑÑим из ÑиÑловÑÑ
пÑимиÑивов):
```java
Stream
.of("12", "22", "4", "444", "123")
.mapToInt(Integer::parseInt)
.toArray(); //[12, 22, 4, 444, 123]
```
ÐÑоме Ñого, `map()` Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Ð² ÑÐµÐ±Ñ ÑÑнкÑионалÑнÑй инÑеÑÑÐµÐ¹Ñ Functional.
[к оглавлениÑ](#java-8)
## Ðакова ÑÐµÐ»Ñ Ð¼ÐµÑода `filter()` в ÑÑÑимаÑ
?
ÐеÑод `filter()` ÑвлÑеÑÑÑ Ð¿ÑомежÑÑоÑной опеÑаÑией пÑинимаÑÑей пÑедикаÑ, коÑоÑÑй ÑилÑÑÑÑÐµÑ Ð²Ñе ÑлеменÑÑ, возвÑаÑÐ°Ñ ÑолÑко Ñе, ÑÑо ÑооÑвеÑÑÑвÑÑÑ ÑÑловиÑ.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего в ÑÑÑимаÑ
пÑедназнаÑен меÑод `limit()`?
ÐеÑод `limit()` ÑвлÑеÑÑÑ Ð¿ÑомежÑÑоÑной опеÑаÑией, коÑоÑÐ°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð¾Ð³ÑаниÑиÑÑ Ð²ÑбоÑÐºÑ Ð¾Ð¿ÑеделеннÑм колиÑеÑÑвом пеÑвÑÑ
ÑлеменÑов.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего в ÑÑÑимаÑ
пÑедназнаÑен меÑод `sorted()`?
ÐеÑод `sorted()` ÑвлÑеÑÑÑ Ð¿ÑомежÑÑоÑной опеÑаÑией, коÑоÑÐ°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ ÑоÑÑиÑоваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð»Ð¸Ð±Ð¾ в наÑÑÑалÑном поÑÑдке, либо Ð·Ð°Ð´Ð°Ð²Ð°Ñ `Comparator`.
ÐоÑÑдок ÑлеменÑов в иÑÑ
одной коллекÑии оÑÑаеÑÑÑ Ð½ÐµÑÑонÑÑÑм - `sorted()` вÑего лиÑÑ ÑÐ¾Ð·Ð´Ð°ÐµÑ ÐµÐ³Ð¾ оÑÑоÑÑиÑованное пÑедÑÑавление.
[к оглавлениÑ](#java-8)
## ÐÐ»Ñ Ñего в ÑÑÑимаÑ
пÑедназнаÑÐµÐ½Ñ Ð¼ÐµÑÐ¾Ð´Ñ `flatMap()`, `flatMapToInt()`, `flatMapToDouble()`, `flatMapToLong()`?
ÐеÑод `flatMap()` поÑ
ож на map, но Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑеобÑазовÑваÑÑ Ð¸Ð· неÑколÑкиÑ
ÑлеменÑов (ÑÑÑимов, маÑÑивов, коллекÑий) один. ÐапÑÐ¸Ð¼ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ пÑеобÑазоваÑÑ Ð´Ð²ÑмеÑнÑй маÑÑив в одномеÑнÑй:
```java
int[][] arr = {{1,2}, {5,6}, {3,4}};
Arrays.stream(arr).flatMapToInt(x -> Arrays.stream(x)).forEach(System.out::println);
```
Ðли из ÑÑÑима лиÑÑов полÑÑиÑÑ Ð¾Ð´Ð¸Ð½ ÑÑÑим:
```java
public static void main(String[] args) {
List humans = asList(
new Human("Sam", asList("Buddy", "Lucy")),
new Human("Bob", asList("Frankie", "Rosie")),
new Human("Marta", asList("Simba", "Tilly")));
List petNames = humans.stream()
.map(human -> human.getPets()) //пÑеобÑазовÑваем Stream в Stream>
.flatMap(pets -> pets.stream())//"ÑазвоÑаÑиваем" Stream> в Stream
.collect(Collectors.toList());
System.out.println(petNames); // output [Buddy, Lucy, Frankie, Rosie, Simba, Tilly]
}
```
Ðли ÑазбиÑÑ ÑÑÑÐ¾ÐºÑ Ð¿Ð¾ бÑквам:
```java
Stream
.of("H e l l o", "w o r l d !")
.flatMap((p) -> Arrays.stream(p.split(" ")))
.toArray(String[]::new);//["H", "e", "l", "l", "o", "w", "o", "r", "l", "d", "!"]
```
`flatMapToInt()`, `flatMapToDouble()`, `flatMapToLong()` - ÑÑо аналоги `flatMap()`, возвÑаÑаÑÑие ÑооÑвеÑÑÑвÑÑÑий ÑиÑловой ÑÑÑим.
[к оглавлениÑ](#java-8)
## РаÑÑкажиÑе о паÑаллелÑной обÑабоÑке в Java 8.
СÑÑÐ¸Ð¼Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¿Ð¾ÑледоваÑелÑнÑми и паÑаллелÑнÑми. ÐпеÑаÑии над поÑледоваÑелÑнÑми ÑÑÑимами вÑполнÑÑÑÑÑ Ð² одном поÑоке пÑоÑеÑÑоÑа, над паÑаллелÑнÑми â иÑполÑзÑÑ Ð½ÐµÑколÑко поÑоков пÑоÑеÑÑоÑа. ÐаÑаллелÑнÑе ÑÑÑÐ¸Ð¼Ñ Ð¸ÑполÑзÑÑÑ Ð¾Ð±Ñий `ForkJoinPool` доÑÑÑпнÑй ÑеÑез ÑÑаÑиÑеÑкий `ForkJoinPool.commonPool()` меÑод. ÐÑи ÑÑом, еÑли окÑÑжение не ÑвлÑеÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÑдеÑнÑм, Ñо поÑок бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ ÐºÐ°Ðº поÑледоваÑелÑнÑй. ФакÑиÑеÑки пÑименение паÑаллелÑнÑÑ
ÑÑÑимов ÑводиÑÑÑ Ðº ÑомÑ, ÑÑо даннÑе в ÑÑÑимаÑ
бÑдÑÑ ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ñ Ð½Ð° ÑаÑÑи, ÐºÐ°Ð¶Ð´Ð°Ñ ÑаÑÑÑ Ð¾Ð±ÑабаÑÑваеÑÑÑ Ð½Ð° оÑделÑном ÑдÑе пÑоÑеÑÑоÑа, и в конÑе ÑÑи ÑаÑÑи ÑоединÑÑÑÑÑ, и над ними вÑполнÑÑÑÑÑ ÐºÐ¾Ð½ÐµÑнÑе опеÑаÑии.
ÐÐ»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð°ÑаллелÑного поÑока из коллекÑии можно Ñакже иÑполÑзоваÑÑ Ð¼ÐµÑод `parallelStream()` инÑеÑÑейÑа `Collection`.
ЧÑÐ¾Ð±Ñ ÑделаÑÑ Ð¾Ð±ÑÑнÑй поÑледоваÑелÑнÑй ÑÑÑим паÑаллелÑнÑм, надо вÑзваÑÑ Ñ Ð¾Ð±ÑекÑа `Stream` меÑод `parallel()`. ÐеÑод `isParallel()` позволÑÐµÑ ÑзнаÑÑ ÑвлÑеÑÑÑ Ð»Ð¸ ÑÑÑим паÑаллелÑнÑм.
С помоÑÑÑ, меÑодов `parallel()` и `sequential()` можно опÑеделÑÑÑ ÐºÐ°ÐºÐ¸Ðµ опеÑаÑии могÑÑ Ð±ÑÑÑ Ð¿Ð°ÑаллелÑнÑми, а какие ÑолÑко поÑледоваÑелÑнÑми. Так же из лÑбого поÑледоваÑелÑного ÑÑÑима можно ÑделаÑÑ Ð¿Ð°ÑаллелÑнÑй и наобоÑоÑ:
```java
collection
.stream()
.peek(...) // опеÑаÑÐ¸Ñ Ð¿Ð¾ÑледоваÑелÑна
.parallel()
.map(...) // опеÑаÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ð°ÑаллелÑно,
.sequential()
.reduce(...) // опеÑаÑÐ¸Ñ Ñнова поÑледоваÑелÑна
```
Ðак пÑавило, ÑлеменÑÑ Ð¿ÐµÑедаÑÑÑÑ Ð² ÑÑÑим в Ñом же поÑÑдке, в коÑоÑом они опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² иÑÑоÑнике даннÑÑ
. ÐÑи ÑабоÑе Ñ Ð¿Ð°ÑаллелÑнÑми ÑÑÑимами ÑиÑÑема ÑоÑ
ÑанÑÐµÑ Ð¿Ð¾ÑÑдок ÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ ÑлеменÑов. ÐÑклÑÑение ÑоÑÑавлÑÐµÑ Ð¼ÐµÑод `forEach()`, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð²ÑводиÑÑ ÑлеменÑÑ Ð² пÑоизволÑном поÑÑдке. Ð ÑÑÐ¾Ð±Ñ ÑоÑ
ÑаниÑÑ Ð¿Ð¾ÑÑдок ÑледованиÑ, необÑ
одимо пÑименÑÑÑ Ð¼ÐµÑод `forEachOrdered()`.
ÐÑиÑеÑии, коÑоÑÑе могÑÑ Ð¿Ð¾Ð²Ð»Ð¸ÑÑÑ Ð½Ð° пÑоизводиÑелÑноÑÑÑ Ð² паÑаллелÑнÑÑ
ÑÑÑимаÑ
:
+ Ð Ð°Ð·Ð¼ÐµÑ Ð´Ð°Ð½Ð½ÑÑ
- Ñем болÑÑе даннÑÑ
, Ñем Ñложнее ÑнаÑала ÑазделÑÑÑ Ð´Ð°Ð½Ð½Ñе, а поÑом иÑ
ÑоединÑÑÑ.
+ ÐолиÑеÑÑво ÑÐ´ÐµÑ Ð¿ÑоÑеÑÑоÑа. ТеоÑеÑиÑеÑки, Ñем болÑÑе ÑÐ´ÐµÑ Ð² компÑÑÑеÑе, Ñем бÑÑÑÑее пÑогÑамма бÑÐ´ÐµÑ ÑабоÑаÑÑ. ÐÑли на маÑине одно ÑдÑо, Ð½ÐµÑ ÑмÑÑла пÑименÑÑÑ Ð¿Ð°ÑаллелÑнÑе поÑоки.
+ Чем пÑоÑе ÑÑÑÑкÑÑÑа даннÑÑ
, Ñ ÐºÐ¾ÑоÑой ÑабоÑÐ°ÐµÑ Ð¿Ð¾Ñок, Ñем бÑÑÑÑее бÑдÑÑ Ð¿ÑоиÑÑ
одиÑÑ Ð¾Ð¿ÐµÑаÑии. ÐапÑимеÑ, даннÑе из `ArrayList` легко иÑполÑзоваÑÑ, Ñак как ÑÑÑÑкÑÑÑа данной коллекÑии пÑÐµÐ´Ð¿Ð¾Ð»Ð°Ð³Ð°ÐµÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ð½ÐµÑвÑзаннÑÑ
даннÑÑ
. Ð Ð²Ð¾Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑÐ¸Ñ Ñипа `LinkedList` - не лÑÑÑий ваÑианÑ, Ñак как в поÑледоваÑелÑном ÑпиÑке вÑе ÑлеменÑÑ ÑвÑÐ·Ð°Ð½Ñ Ñ Ð¿ÑедÑдÑÑими/поÑледÑÑÑими. Ð Ñакие даннÑе ÑÑÑдно ÑаÑпаÑаллелиÑÑ.
+ Ðад даннÑми пÑимиÑивнÑÑ
Ñипов опеÑаÑии бÑдÑÑ Ð¿ÑоизводиÑÑÑÑ Ð±ÑÑÑÑее, Ñем над обÑекÑами клаÑÑов.
+ ÐÑайне не ÑекомендÑеÑÑÑ Ð¸ÑполÑзоваÑÑ Ð¿Ð°ÑаллелÑнÑе ÑÑÑÐ¸Ð¼Ñ Ð´Ð»Ñ ÑколÑко-нибÑÐ´Ñ Ð´Ð¾Ð»Ð³Ð¸Ñ
опеÑаÑий (напÑÐ¸Ð¼ÐµÑ ÑеÑевÑÑ
Ñоединений), Ñак как вÑе паÑаллелÑнÑе ÑÑÑÐ¸Ð¼Ñ ÑабоÑаÑÑ c одним `ForkJoinPool`, Ñо Ñакие долгие опеÑаÑии могÑÑ Ð¾ÑÑановиÑÑ ÑабоÑÑ Ð²ÑеÑ
паÑаллелÑнÑÑ
ÑÑÑимов в JVM из-за оÑÑÑÑÑÑÐ²Ð¸Ñ Ð´Ð¾ÑÑÑпнÑÑ
поÑоков в пÑле, Ñ.е. паÑаллелÑнÑе ÑÑÑÐ¸Ð¼Ñ ÑÑÐ¾Ð¸Ñ Ð¸ÑполÑзоваÑÑ Ð»Ð¸ÑÑ Ð´Ð»Ñ ÐºÐ¾ÑоÑкиÑ
опеÑаÑий, где ÑÑÐµÑ Ð¸Ð´ÐµÑ Ð½Ð° миллиÑекÑндÑ, но не Ð´Ð»Ñ ÑеÑ
где ÑÑÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð´Ñи на ÑекÑÐ½Ð´Ñ Ð¸ минÑÑÑ;
+ СоÑ
Ñанение поÑÑдка в паÑаллелÑнÑÑ
ÑÑÑимаÑ
ÑвелиÑÐ¸Ð²Ð°ÐµÑ Ð¸Ð·Ð´ÐµÑжки пÑи вÑполнении и еÑли поÑÑдок не важен, Ñо имееÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¾ÑклÑÑиÑÑ ÐµÐ³Ð¾ ÑоÑ
Ñанение и Ñем ÑамÑм ÑвелиÑиÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ, иÑполÑзовав пÑомежÑÑоÑнÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ `unordered()`:
```java
collection.parallelStream()
.sorted()
.unordered()
.collect(Collectors.toList());
```
[к оглавлениÑ](#java-8)
## Ðакие конеÑнÑе меÑÐ¾Ð´Ñ ÑабоÑÑ Ñо ÑÑÑимами Ð²Ñ Ð·Ð½Ð°ÐµÑе?
+ `findFirst()` возвÑаÑÐ°ÐµÑ Ð¿ÐµÑвÑй ÑлеменÑ;
+ `findAny()` возвÑаÑÐ°ÐµÑ Ð»Ñбой подÑ
одÑÑий ÑлеменÑ;
+ `collect()` пÑедÑÑавление ÑезÑлÑÑаÑов в виде коллекÑий и дÑÑгиÑ
ÑÑÑÑкÑÑÑ Ð´Ð°Ð½Ð½ÑÑ
;
+ `count()` возвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑлеменÑов;
+ `anyMatch()` возвÑаÑÐ°ÐµÑ `true`, еÑли ÑÑловие вÑполнÑеÑÑÑ Ñ
оÑÑ Ð±Ñ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑлеменÑа;
+ `noneMatch()` возвÑаÑÐ°ÐµÑ `true`, еÑли ÑÑловие не вÑполнÑеÑÑÑ Ð½Ð¸ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑлеменÑа;
+ `allMatch()` возвÑаÑÐ°ÐµÑ `true`, еÑли ÑÑловие вÑполнÑеÑÑÑ Ð´Ð»Ñ Ð²ÑеÑ
ÑлеменÑов;
+ `min()` возвÑаÑÐ°ÐµÑ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑнÑй ÑлеменÑ, иÑполÑзÑÑ Ð² каÑеÑÑве ÑÑÐ»Ð¾Ð²Ð¸Ñ `Comparator`;
+ `max()` возвÑаÑÐ°ÐµÑ Ð¼Ð°ÐºÑималÑнÑй ÑлеменÑ, иÑполÑзÑÑ Ð² каÑеÑÑве ÑÑÐ»Ð¾Ð²Ð¸Ñ `Comparator`;
+ `forEach()` пÑименÑÐµÑ ÑÑнкÑÐ¸Ñ Ðº ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ (поÑÑдок пÑи паÑаллелÑном вÑполнении не гаÑанÑиÑÑеÑÑÑ);
+ `forEachOrdered()` пÑименÑÐµÑ ÑÑнкÑÐ¸Ñ Ðº ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ Ñ ÑоÑ
Ñанением поÑÑдка ÑлеменÑов;
+ `toArray()` возвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив знаÑений;
+ `reduce()`позволÑÐµÑ Ð²ÑполнÑÑÑ Ð°Ð³ÑегаÑнÑе ÑÑнкÑии и возвÑаÑаÑÑ Ð¾Ð´Ð¸Ð½ ÑезÑлÑÑаÑ.
ÐÐ»Ñ ÑиÑловÑÑ
ÑÑÑимов дополниÑелÑно доÑÑÑпнÑ:
+ `sum()` возвÑаÑÐ°ÐµÑ ÑÑÐ¼Ð¼Ñ Ð²ÑеÑ
ÑиÑел;
+ `average()` возвÑаÑÐ°ÐµÑ ÑÑеднее аÑиÑмеÑиÑеÑкое вÑеÑ
ÑиÑел.
[к оглавлениÑ](#java-8)
## Ðакие пÑомежÑÑоÑнÑе меÑÐ¾Ð´Ñ ÑабоÑÑ Ñо ÑÑÑимами Ð²Ñ Ð·Ð½Ð°ÐµÑе?
+ `filter()` оÑÑилÑÑÑовÑÐ²Ð°ÐµÑ Ð·Ð°Ð¿Ð¸Ñи, возвÑаÑÐ°Ñ ÑолÑко запиÑи, ÑооÑвеÑÑÑвÑÑÑие ÑÑловиÑ;
+ `skip()` позволÑÐµÑ Ð¿ÑопÑÑÑиÑÑ Ð¾Ð¿ÑеделÑнное колиÑеÑÑво ÑлеменÑов в наÑале;
+ `distinct()` возвÑаÑÐ°ÐµÑ ÑÑÑим без дÑбликаÑов (Ð´Ð»Ñ Ð¼ÐµÑода `equals()`);
+ `map()` пÑеобÑазÑÐµÑ ÐºÐ°Ð¶Ð´Ñй ÑлеменÑ;
+ `peek()` возвÑаÑÐ°ÐµÑ ÑÐ¾Ñ Ð¶Ðµ ÑÑÑим, пÑименÑÑ Ðº ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÑлеменÑÑ ÑÑнкÑиÑ;
+ `limit()` позволÑÐµÑ Ð¾Ð³ÑаниÑиÑÑ Ð²ÑбоÑÐºÑ Ð¾Ð¿ÑеделеннÑм колиÑеÑÑвом пеÑвÑÑ
ÑлеменÑов;
+ `sorted()` позволÑÐµÑ ÑоÑÑиÑоваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð»Ð¸Ð±Ð¾ в наÑÑÑалÑном поÑÑдке, либо Ð·Ð°Ð´Ð°Ð²Ð°Ñ `Comparator`;
+ `mapToInt()`, `mapToDouble()`, `mapToLong()` - аналоги `map()` возвÑаÑаÑÑие ÑÑÑим ÑиÑловÑÑ
пÑимиÑивов;
+ `flatMap()`, `flatMapToInt()`, `flatMapToDouble()`, `flatMapToLong()` - поÑ
ожи на `map()`, но могÑÑ ÑоздаваÑÑ Ð¸Ð· одного ÑлеменÑа неÑколÑко.
ÐÐ»Ñ ÑиÑловÑÑ
ÑÑÑимов дополниÑелÑно доÑÑÑпен меÑод `mapToObj()`, коÑоÑÑй пÑеобÑазÑÐµÑ ÑиÑловой ÑÑÑим обÑаÑно в обÑекÑнÑй.
[к оглавлениÑ](#java-8)
## Ðак вÑвеÑÑи на ÑкÑан 10 ÑлÑÑайнÑÑ
ÑиÑел, иÑполÑзÑÑ `forEach()`?
```java
(new Random())
.ints()
.limit(10)
.forEach(System.out::println);
```
[к оглавлениÑ](#java-8)
## Ðак можно вÑвеÑÑи на ÑкÑан ÑникалÑнÑе квадÑаÑÑ ÑиÑел иÑполÑзÑÑ Ð¼ÐµÑод `map()`?
```java
Stream
.of(1, 2, 3, 2, 1)
.map(s -> s * s)
.distinct()
.collect(Collectors.toList())
.forEach(System.out::println);
```
[к оглавлениÑ](#java-8)
## Ðак вÑвеÑÑи на ÑкÑан колиÑеÑÑво пÑÑÑÑÑ
ÑÑÑок Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÐµÑода `filter()`?
```java
System.out.println(
Stream
.of("Hello", "", ", ", "world", "!")
.filter(String::isEmpty)
.count());
```
[к оглавлениÑ](#java-8)
## Ðак вÑвеÑÑи на ÑкÑан 10 ÑлÑÑайнÑÑ
ÑиÑел в поÑÑдке возÑаÑÑаниÑ?
```java
(new Random())
.ints()
.limit(10)
.sorted()
.forEach(System.out::println);
```
[к оглавлениÑ](#java-8)
## Ðак найÑи макÑималÑное ÑиÑло в набоÑе?
```java
Stream
.of(5, 3, 4, 55, 2)
.mapToInt(a -> a)
.max()
.getAsInt(); //55
```
[к оглавлениÑ](#java-8)
## Ðак найÑи минималÑное ÑиÑло в набоÑе?
```java
Stream
.of(5, 3, 4, 55, 2)
.mapToInt(a -> a)
.min()
.getAsInt(); //2
```
[к оглавлениÑ](#java-8)
## Ðак полÑÑиÑÑ ÑÑÐ¼Ð¼Ñ Ð²ÑеÑ
ÑиÑел в набоÑе?
```java
Stream
.of(5, 3, 4, 55, 2)
.mapToInt()
.sum(); //69
```
[к оглавлениÑ](#java-8)
## Ðак полÑÑиÑÑ ÑÑеднее знаÑение вÑеÑ
ÑиÑел?
```java
Stream
.of(5, 3, 4, 55, 2)
.mapToInt(a -> a)
.average()
.getAsDouble(); //13.8
```
[к оглавлениÑ](#java-8)
## Ðакие дополниÑелÑнÑе меÑÐ¾Ð´Ñ Ð´Ð»Ñ ÑабоÑÑ Ñ Ð°ÑÑоÑиаÑивнÑми маÑÑивами (maps) поÑвилиÑÑ Ð² Java 8?
+ `putIfAbsent()` добавлÑÐµÑ Ð¿Ð°ÑÑ Â«ÐºÐ»ÑÑ-знаÑение», ÑолÑко еÑли клÑÑ Ð¾ÑÑÑÑÑÑвовал:
`map.putIfAbsent("a", "Aa");`
+ `forEach()` пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð¿ÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð½Ð°Ð´ каждÑм ÑлеменÑом:
`map.forEach((k, v) -> System.out.println(v));`
+ `compute()` ÑоздаÑÑ Ð¸Ð»Ð¸ обновлÑÐµÑ ÑекÑÑее знаÑение на полÑÑенное в ÑезÑлÑÑаÑе вÑÑиÑÐ»ÐµÐ½Ð¸Ñ (возможно иÑполÑзоваÑÑ ÐºÐ»ÑÑ Ð¸ ÑекÑÑее знаÑение):
`map.compute("a", (k, v) -> String.valueOf(k).concat(v)); //["a", "aAa"]`
+ `computeIfPresent()` еÑли клÑÑ ÑÑÑеÑÑвÑеÑ, обновлÑÐµÑ ÑекÑÑее знаÑение на полÑÑенное в ÑезÑлÑÑаÑе вÑÑиÑÐ»ÐµÐ½Ð¸Ñ (возможно иÑполÑзоваÑÑ ÐºÐ»ÑÑ Ð¸ ÑекÑÑее знаÑение):
`map.computeIfPresent("a", (k, v) -> k.concat(v));`
+ `computeIfAbsent()` еÑли клÑÑ Ð¾ÑÑÑÑÑÑвÑеÑ, ÑоздаÑÑ ÐµÐ³Ð¾ Ñо знаÑением, коÑоÑое вÑÑиÑлÑеÑÑÑ (возможно иÑполÑзоваÑÑ ÐºÐ»ÑÑ):
`map.computeIfAbsent("a", k -> "A".concat(k)); //["a","Aa"]`
+ `getOrDefault()` в ÑлÑÑае оÑÑÑÑÑÑÐ²Ð¸Ñ ÐºÐ»ÑÑа, возвÑаÑÐ°ÐµÑ Ð¿ÐµÑеданное знаÑение по-ÑмолÑаниÑ:
`map.getOrDefault("a", "not found");`
+ `merge()` пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÐºÐ»ÑÑ, знаÑение и ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð¾Ð±ÑединÑÐµÑ Ð¿ÐµÑедаваемое и ÑекÑÑее знаÑениÑ. ÐÑли под заданнÑм клÑÑем знаÑение оÑÑÑÑÑÑвÑеÑ, Ñо запиÑÑÐ²Ð°ÐµÑ ÑÑда пеÑедаваемое знаÑение.
`map.merge("a", "z", (value, newValue) -> value.concat(newValue)); //["a","Aaz"]`
[к оглавлениÑ](#java-8)
## ЧÑо Ñакое `LocalDateTime`?
`LocalDateTime` обÑединÑÐµÑ Ð²Ð¼ÐµÑÑе `LocaleDate` и `LocalTime`, ÑодеÑÐ¶Ð¸Ñ Ð´Ð°ÑÑ Ð¸ вÑÐµÐ¼Ñ Ð² календаÑной ÑиÑÑеме ISO-8601 без пÑивÑзки к ÑаÑÐ¾Ð²Ð¾Ð¼Ñ Ð¿Ð¾ÑÑÑ. ÐÑÐµÐ¼Ñ Ñ
ÑаниÑÑÑ Ñ ÑоÑноÑÑÑÑ Ð´Ð¾ наноÑекÑндÑ. СодеÑÐ¶Ð¸Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑво ÑдобнÑÑ
меÑодов, ÑакиÑ
как plusMinutes, plusHours, isAfter, toSecondOfDay и Ñ.д.
[к оглавлениÑ](#java-8)
## ЧÑо Ñакое `ZonedDateTime`?
`java.time.ZonedDateTime` â аналог `java.util.Calendar`, клаÑÑ Ñ ÑамÑм полнÑм обÑемом инÑоÑмаÑии о вÑеменном конÑекÑÑе в календаÑной ÑиÑÑеме ISO-8601. ÐклÑÑÐ°ÐµÑ Ð²ÑеменнÑÑ Ð·Ð¾Ð½Ñ, поÑÑÐ¾Ð¼Ñ Ð²Ñе опеÑаÑии Ñ Ð²ÑеменнÑми Ñдвигами ÑÑÐ¾Ñ ÐºÐ»Ð°ÑÑ Ð¿ÑÐ¾Ð²Ð¾Ð´Ð¸Ñ Ñ ÐµÑ ÑÑÑÑом.
[к оглавлениÑ](#java-8)
## Ðак полÑÑиÑÑ ÑекÑÑÑÑ Ð´Ð°ÑÑ Ñ Ð¸ÑполÑзованием Date Time API из Java 8?
```java
LocalDate.now();
```
[к оглавлениÑ](#java-8)
## Ðак добавиÑÑ 1 неделÑ, 1 меÑÑÑ, 1 год, 10 Ð»ÐµÑ Ðº ÑекÑÑей даÑе Ñ Ð¸ÑполÑзованием Date Time API?
```java
LocalDate.now().plusWeeks(1);
LocalDate.now().plusMonths(1);
LocalDate.now().plusYears(1);
LocalDate.now().plus(1, ChronoUnit.DECADES);
```
[к оглавлениÑ](#java-8)
## Ðак полÑÑиÑÑ ÑледÑÑÑий вÑоÑник иÑполÑзÑÑ Date Time API?
```java
LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.TUESDAY));
```
[к оглавлениÑ](#java-8)
## Ðак полÑÑиÑÑ Ð²ÑоÑÑÑ ÑÑббоÑÑ ÑекÑÑего меÑÑÑа иÑполÑзÑÑ Date Time API?
```java
LocalDate
.of(LocalDate.now().getYear(), LocalDate.now().getMonth(), 1)
.with(TemporalAdjusters.nextOrSame(DayOfWeek.SATURDAY))
.with(TemporalAdjusters.next(DayOfWeek.SATURDAY));
```
[к оглавлениÑ](#java-8)
## Ðак полÑÑиÑÑ ÑекÑÑее вÑÐµÐ¼Ñ Ñ ÑоÑноÑÑÑÑ Ð´Ð¾ миллиÑекÑнд иÑполÑзÑÑ Date Time API?
```java
new Date().toInstant();
```
[к оглавлениÑ](#java-8)
## Ðак полÑÑиÑÑ ÑекÑÑее вÑÐµÐ¼Ñ Ð¿Ð¾ меÑÑÐ½Ð¾Ð¼Ñ Ð²Ñемени Ñ ÑоÑноÑÑÑÑ Ð´Ð¾ миллиÑекÑнд иÑполÑзÑÑ Date Time API?
```java
LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());
```
[к оглавлениÑ](#java-8)
## Ðак опÑеделиÑÑ Ð¿Ð¾Ð²ÑоÑÑемÑÑ Ð°Ð½Ð½Ð¾ÑаÑиÑ?
ЧÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ Ð¿Ð¾Ð²ÑоÑÑемÑÑ Ð°Ð½Ð½Ð¾ÑаÑиÑ, необÑ
одимо ÑоздаÑÑ Ð°Ð½Ð½Ð¾ÑаÑиÑ-конÑÐµÐ¹Ð½ÐµÑ Ð´Ð»Ñ ÑпиÑка повÑоÑÑемÑÑ
анноÑаÑий и обознаÑиÑÑ Ð¿Ð¾Ð²ÑоÑÑемÑÑ Ð¼ÐµÑа-анноÑаÑией `@Repeatable`:
```java
@interface Schedulers
{
Scheduler[] value();
}
@Repeatable(Schedulers.class)
@interface Scheduler
{
String birthday() default "Jan 8 1935";
}
```
[к оглавлениÑ](#java-8)
## ЧÑо Ñакое `Nashorn`?
__Nashorn__ - ÑÑо движок JavaScript, ÑазÑабаÑÑваемÑй на Java компанией Oracle. ÐÑизван даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²ÑÑÑаиваÑÑ ÐºÐ¾Ð´ JavaScript в пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Java. Ð ÑÑавнении Ñ _Rhino_, коÑоÑÑй поддеÑживаеÑÑÑ Mozilla Foundation, Nashorn обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð¾Ñ 2 до 10 Ñаз более вÑÑокÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ, Ñак как он компилиÑÑÐµÑ ÐºÐ¾Ð´ и пеÑÐµÐ´Ð°ÐµÑ Ð±Ð°Ð¹Ñ-код виÑÑÑалÑной маÑине Java непоÑÑедÑÑвенно в памÑÑи. Nashorn ÑÐ¼ÐµÐµÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ð¸ÑоваÑÑ ÐºÐ¾Ð´ JavaScript и генеÑиÑоваÑÑ ÐºÐ»Ð°ÑÑÑ Java, коÑоÑÑе загÑÑжаÑÑÑÑ ÑпеÑиалÑнÑм загÑÑзÑиком. Так же возможен вÑзов кода Java пÑÑмо из JavaScript.
[к оглавлениÑ](#java-8)
## ЧÑо Ñакое `jjs`?
`jjs` ÑÑо ÑÑилиÑа командной ÑÑÑоки, коÑоÑÐ°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð¸ÑполнÑÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð½Ð° ÑзÑке JavaScript пÑÑмо в конÑоли.
[к оглавлениÑ](#java-8)
## Ðакой клаÑÑ Ð¿Ð¾ÑвилÑÑ Ð² Java 8 Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸ÑованиÑ/декодиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
?
`Base64` - поÑокобезопаÑнÑй клаÑÑ, коÑоÑÑй ÑеализÑÐµÑ ÐºÐ¾Ð´Ð¸ÑовÑик и декодиÑовÑик даннÑÑ
, иÑполÑзÑÑ ÑÑ
ÐµÐ¼Ñ ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ base64 ÑоглаÑно _RFC 4648_ и _RFC 2045_.
Base64 ÑодеÑÐ¶Ð¸Ñ 6 оÑновнÑÑ
меÑодов:
`getEncoder()`/`getDecoder()` - возвÑаÑÐ°ÐµÑ ÐºÐ¾Ð´Ð¸ÑовÑик/декодиÑовÑик base64, ÑооÑвеÑÑÑвÑÑÑий ÑÑандаÑÑÑ _RFC 4648_;
`getUrlEncoder()`/`getUrlDecoder()` - возвÑаÑÐ°ÐµÑ URL-safe кодиÑовÑик/декодиÑовÑик base64, ÑооÑвеÑÑÑвÑÑÑий ÑÑандаÑÑÑ _RFC 4648_;
`getMimeEncoder()`/`getMimeDecoder()` - возвÑаÑÐ°ÐµÑ MIME кодиÑовÑик/декодиÑовÑик, ÑооÑвеÑÑÑвÑÑÑий ÑÑандаÑÑÑ _RFC 2045_.
[к оглавлениÑ](#java-8)
## Ðак ÑоздаÑÑ Base64 кодиÑовÑик и декодиÑовÑик?
```java
// Encode
String b64 = Base64.getEncoder().encodeToString("input".getBytes("utf-8")); //aW5wdXQ==
// Decode
new String(Base64.getDecoder().decode("aW5wdXQ=="), "utf-8"); //input
```
[к оглавлениÑ](#java-8)
# ÐÑÑоÑники
+ [ХабÑаÑ
Ð°Ð±Ñ - Ðовое в Java 8](https://habrahabr.ru/post/216431/)
+ [ХабÑаÑ
Ð°Ð±Ñ - ШпаÑгалка Java пÑогÑаммиÑÑа 4. Java Stream API](https://habrahabr.ru/company/luxoft/blog/270383/)
+ [METANIT.COM](http://metanit.com/java/tutorial/9.1.php)
+ [javadevblog.com](http://javadevblog.com/interfejsy-v-java-8-staticheskie-metody-metody-po-umolchaniyu-funktsional-ny-e-interfejsy.html)
[ÐопÑоÑÑ Ð´Ð»Ñ ÑобеÑедованиÑ](README.md)