C Java oding Problems lmprove your Java Programming skills Ьу solving real-world coding challenges Anghel Leonard Pacl<t> BIRMINGHAM -MUMBAI Анджел Леонард РЕШЕНИЕ ПРАКТИЧЕСКИХ ЗАДАЧ Санкт-Петербург БХВ-Петербург» « 2021 УДК 004.438 ББК 32.973-018. l Л47 Леонард А. Л47 Java. Решение практических задач : пер. с англ. -СПб.: БХВ-Петербург, 2021. -720 с.: ил. ISBN 978-5-9775-6719-0 Рассмотрены задачи, встречаюшиеся в повседневной работе любого разработ чика в среде Java. Приведено более приложений, содержащих свыше при 300 1000 меров. Продемонстрированы эффективные практические приемы и технические решения с учетом сложности кода, производительности, удобочитаемости и мно гого другого. Рассмотрены строки, числа, объекты, массивы, коллекции и структуры данных, работа с датой и временем. Приведены задачи на логический вывод типов, а также файловый ввод/вывод. Представлены задачи, связанные с АР! рефлексии Java. Особое внимание уделено программированию в функциональном стиле, задачам с привлечением конкурентности, правилам работы с классом Optional, а также АР! НТТР-клиента и АР! протокола WebSocket. Для Jаvа-программистов УДК 004.438 ББК 32.973-018.1 Группа подготовки издания: Руководитnерлоье кта ЕвгениРйы баков Завр.е дакцией Людмила Гауль Перевосд а нглийского АндреЛяо гунова Комnьютернваеяр стка НатальиС мирновой Оформлениоеб ложки КариныС оловьевой © PackPtu Ыishi2n0g1 9F.i rpsutЫ ishiendt heE nglilsahn guaugned etrh et it'lJea vCao dinPgr oЫem-s (9781789801415)' Вnервыоеn убликовнаана он глийскяозмы кnео дн азвани'еJмa vCao dinPgr oЫem-s( 9781789801415)' Подписаноп ечать в 30 04 21 Формат 1 Печатоьф сетная печ 70х100/16 Ycn n 58,05 Тираж экзЗ аказ 1200 № 8321 "БХВ-Петербург", Санкт-ПетербуГрогн,ч арнуаля, 191036, 20 Отпечатанво ПАО «Можайскипйо лиграфическкоимйб инат)> 143200Р,о ссияr ,М ожайску,л Мира,9 3 wwн oaompk ru, тел (4957)4 5·84-2(84,9 6382)0 -685 ISBN 978-1-78847-141-5 (англ.) © Packt PuЬ\ish1ng 2019 ISBN 978-5-9775-6719-0 (рус.) © Перевод на русский язык, оформление ООО "БХВ-Петербург", ООО "БХВ", 2021 О главление Составители . .. ... .. .. . . .. . . .... ... ......... . ............ ....... .... . . .. ........ ...... 19 ... . . .. .................. ...... . . .... . . ....... . . Об авторе ". ................. """. . ". . ". . """. ". ...................... ". . ". ..... ". ........................................... 19 .. О рецензентах . ". .......................................... "". .. ". ............................................. 19 .................... Предисловие .... .. ... . . .. ...... .......... ... ........... . .... .............. ....... .. ........ . ...... .. . .... 21 . ... .... . . .. . ..... .. . . . .. .. .. Для кого эта книга предназначена. ....." .. " ......................" ." .... " ........................................... 21 Что эта книга охватывает""" ............................... " ..." ". ." .".". ............................................. 22 Как получить максимальную отдачу от этой книги """.""".""".""""""""""."""""".""25 Файлы с примерами исходного кода. .............................. "."."" ........................................... 25 Цветные изображения. ........." ". . "".""" ............" """ ..................................................... " .. ""2 6 Код в действии .................................................... " .......................................................... " ..... 26 Условные обозначения .................................... """" ..." ." ................................................ """ 26 Комментарии переводчика ......................................................................... "."."""."." ......... 27 Глава 1. Строки, числа и математика .. . ... .. . .. .. .. .. .. .. . . ........ . . . . . 29 . ...... . .... .. ... .. . . ...... ............... Задачи 29 ...................................................................................................................................... Решения. ............................................................. " .......................................... " ..." .. """."""".32 1. Подсчет повторяющихся символов """""""""""."".""""."".". "" ""."."""""""". 32 О символах Юникода .................................................................... """." .. """ ....... 33 2. Отыскание первого неп овторяющегося символа """""""""""""""""""."""""". 36 3. Инвертирование букв и слов .................................................... " ... """"""" ... " ......" . 38 4. Проверка, содержит ли строковое значение только цифры """"""""""""""""". 39 5. Подсчет гласных и согласных ". .... """. ........................................ 40 ............................. 6. Подсчет появлений некоторого символа ......" .......................................................... 42 7. Конвертирование строки в значение типа int, long,float или dоиЫе """"""""" . .43 . 8. Удаление пробелов из строки . "". ...... ".". .. """.". ... ". . ". . ". ..................................... 44 ... 9. Соединение нескольких строк с помощью разделителя """""""""""""""""""" 44 . 1 О. Генерирование всех перестановок""""."".""""""""""""""".""."""""""""""" 46 11. Проверка, что строка является палиндромом """""""""""."""""""""""""""".48 12. Удаление повторяющихся символов "."".""""""""""""""""""""""""""."""".49 13. Удаление заданного символа""""""""""""""".""""""""".""".""."""""""""". 51 14. Отыскание символа с наибольшим числом появлений"""""""""""""."""""""52 15. Сортировка массива строк по длине"".""""""""""""""""""".""""""""""""." 54 16. Проверка наличия подстроки в строке"""""""""""""""""""".""""""""""""" 56 17. Подсчет числа появлений подстроки в строке"""""""""""""""""""""""."""" 56 Оглавление 18. Проверка, являются ли две строки анаграммами .. . . 58 ..................................... ......... 19. Объявление многострочных строковых литералов (или текстовых блоков) 59 п ...... 20. Конкатенирование одной и той же строки раз . . . . . . 60 .............................................. 21. Удаление начальных и замыкающих пробелов . . .. . . . . 62 ................. ............................ 22. Поиск наибольшего общего префикса . . .. . 62 .......................................... ..................... 23. Применение отступа. ................................................................................................ 63 24. Трансформирование строк. ...................................................................................... 65 25. Вычисление минимума и максимума двух чисел .................................................. 66 26. Сложение двух крупных чисел типа int/long и переполнение операции . 67 ............ 27. Строка как беззнаковое число с основанием системы счисления ....................... 68 28. Конвертирование в число посредством беззнаковой конверсии .. 69 ...................... . 29. Сравнение двух беззнаковых чисел ........................................................................ 70 30. Вычисление частного и остатка от деления беззнаковых значений .................... 70 31. Значение типа douЫe/float является конечным значением с плавающей точкой······························································································································ 71 32. Применение логического И/ИЛИ/исключающего ИЛИ к двум булевым выражениям. .................................................................................................................... 72 33. Конвертирование значения типа Biglnteger в примитивный тип .. . . 73 ........ ............. 34. Конвертирование значение типа long в значение типа int . .. . 74 ........... ..................... 35. Вычисление целой части деления и целой части остатка от деления . 75 ................ 36. Следующее значение с плавающей точкой ............................................................ 76 37. Умножение двух крупных значений типа int/long и переполнение операции . 77 ... 38. Совмещенное умножение-сложение (Fused Multiply Add) . . 79 ................................. 39. Компактное форматирование чисел ....................................................................... 79 Форматирование .................................................................................................... 80 Разбор числа ........................................................................................................... 82 Резюме. .................................................................................................................................... 83 Глава 2. Объекты, немутируемость и выражения switch 84 ••••••••••••••••••••••••.•.•..•.•............ Задачи 84 ...................................................................................................................................... Решения. .................................................................................................................................. 86 40. Проверка ссылок на null в функциональном и императивном стилях программирования .. . .. . . ... 86 ............ .................................................. .................................. 41. Проверка ссылок на null и выбрасывание собственного исключения NullPointerException ....................................................................................................... 89 42. Проверка ссылок на null и выбрасывание заданного исключения . . .. 91 .................. 43. Проверка ссылок на null и возврат непустых ссылок, заданных по умолчанию. ...................................................................................................................... 93 44. Проверка индекса в интервале от О до длины. ....................................................... 94 45. Проверка подынтервала в интервале от О до длины ............................................. 96 46. Методы equals() и hashCode(). ................................................................................. 97 4 7. Немутируемые объекты в двух словах ................................................................. 103 48. Немутируемая строка ............................................................................................. 104 Достоинства немутируемости строк . . . . . 104 ............................................................. Недостатки немутируемости строк .................................................................... 106 Является ли класс String полностью немутируемым? ...................................... 107 [ 6 ] Оглавление 49. Немутируемый класс . . . . . . . 108 ....................................................................................... 50. Передача мутируемых объектов в немутируемый класс и возврат мутируемых объектов из него ..................................................................................... 109 51. Написание немутируемого класса с помощью шаблона строителя. .................. 112 52. Предотвращение плохих данных в немутируемых объектах ............................. 114 53. Клонирование объектов ......................................................................................... 116 Клонирование ручное .......................................................................................... 117 Клонирование методом clone() ........................................................................... 117 Клонирование посредством конструктора ........................................................ 118 Клонирование посредством библиотеки Cloning .............................................. 119 Клонирование посредством сериализации ........................................................ 120 Клонирование посредством JSON . . .. . . . 121 .................................. ............................. 54. Переопределение метода toString() ....................................................................... 121 55. Выражения switch ................................................................................................... 123 56. Многочисленные метки вариантов ....................................................................... 126 57. Блоки инструкций. .................................................................................................. 126 Резюме. .................................................................................................................................. 127 Глава 3. Работа датой и временем ............................................................................. . 128 с .. Задачи 128 .................................................................................................................................... Решения. ................................................................................................................................ 130 58. Конвертирование строки в дату и время .............................................................. 130 До JDK 8 ............................................................................................................... 130 Начиная с JDK 8 ................................................................................................... 130 59. Форматирование даты и времени. ......................................................................... 134 60. Получение текущих даты и времени без времени или даты .............................. 137 61. Класс LocalDateTime из LocalDate и LocalTime ................................................... 137 62. Машинное время посредством класса lnstant ...................................................... 137 Конвертирование значения String в объект lnstant ........................................... 138 Прибавление времени к объекту Instant или вычитание времени из объекта lnstant .................................................................................................................... 138 Сравнение объектов lnstant ................................................................................. 139 Конвертирование из объекта Instant в LocalDateTime, ZonedDateTime и OffsetDateTime и обратно ................................................................................. 139 63. Определение временного периода с использованием значений на основе даты и значений на основе времени ........................................................................... 140 Период времени с использованием значений на основе даты ......................... 140 Продолжительность времени с использованием значений на основе времени ................................................................................................................. 142 64. Получение единиц даты и времени. ...................................................................... 144 65. Прибавление к дате и времени и вычитание из них ............................................ 145 Работа с датой ...................................................................................................... 145 Работа с LocalDateTime ....................................................................................... 145 66. Получение всех часовых поясов в UTC и GMT . .. 146 ............................. ................... До JDK 8 ............................................................................................................... 147 Начиная с JDK 8 ................................................................................................... 147 [ 7 ] Оглавление 67. Получение локальных даты и времени во всех имеющихся часовых поясах ... 148 До JDK 8 149 ............................................................................................................... Начиная с JDK 8 . . .. . . ... 149 ...................................... ...... .............................................. 68. Вывод на экран информации о дате и времени полета . 150 .............. ........................ 69. Конвертирование временной метки UNIX в дату и время . . 151 ............................... 70. Отыскание первого/последнего дня месяца . 152 ........................................................ 71. Определение/извлечение поясных смещений . . . . 154 .................................................. ДoJDK8 . 155 .............................................................................................................. Начиная с JDK 8 . . . 155 ................................................................................................ 72. Конвертирование из даты во время и наоборот . . . 156 ................................................ Date -lnstant . . . 156 .................................................................................................... Date -Loca!Date . 157 ................................................................................................ Date - DateLocalTime . . . . 158 ..................................................................................... Date -ZonedDateTime . 158 ....................................................................................... Date -OffsetDateTime . . . 159 ..................................................................................... Date -LocalTime . . . . 159 ............................................................................................. Date -OffsetTime . . . . . 159 ........................................................................................... 73. Обход интервала дат в цикле . 160 ................................................................................ До JDK 8 ............................................................................................................... 160 Начиная с JDK 8 ................................................................................................... 160 Начиная с JDK 9 ................................................................................................... 161 74. Вычисление возраста . . . . . . 161 .................................................................................. ...... ДoJDK8 . . . 161 ............................................................................................................ Начиная с JDK 8 . . . . . 161 .............................................................................................. 75. Начало и конец дня . . . 162 .............................................................................. ................ 76. Разница между двумя датами . 164 ............................................................................... До JDK 8 . . 164 ............................................................................................................. Начиная с JDK 8 ... . .. . . . 165 ............................................................ ..... .. ....................... 77. Имплементация шахматных часов . 166 ....................................................................... Резюме . . . .. . 171 ............................................................ ................................................................. Глава 4. Логический вывод типов"""""".". . """""". .." """"""""""""""""." .." """".172 Задачи 172 .................................................................................................................................... Решения . . . . . . . . 174 ......................................................................................................................... 78. Простой пример с использованием переменной типа var .. 174 ................................ 79. Использование типа var с примитивными типами . . 177 ............................................ 80. Использование типа var и неявного приведения типов для поддержания технической сопроводимости исходного кода .......................................................... 178 81. Явное понижающее приведение типов или как избегать типа var . . . 180 ................. 82. Как отказаться от типа var, если вызываемые имена не содержат для людей достаточной информации о типе . 180 ................................................................................ 83. Сочетание LVТI и программирования согласно интерфейсу. ............................ 182 84. Сочетание L VТI и ромбовидного оператора 183 ........................................................ 85. Присвоение массива переменной типа var 184 ........................................................... 86. Использование LVТI в составных объявлениях . . . 184 ............................................... 87. LVТI и область видимости переменной . . 185 ............................................................. [ 8 ] Оглавление 88. LVTI и тернарный оператор . . . . 186 .............................................................................. 89. LVTI и циклыfоr .................................................................................................... 187 90. LVTI и потоки .. . .. . 188 ............................................. ....... ............................................... 91. Использование LVТI для разбиения вложенных/крупных цепочек выражений . . 189 ................................................................................................................... 92. LV ТI и возвращаемый и аргументный типы метода .. . . 190 ....................................... 93. LVTI и анонимные классы . . .. . . . . 191 .... ......................................................................... 94. LVТI может быть финальным и практически финальным . 192 ................................ 95. LVTI лямбда-выражения . . 193 и .................................................................................. 96. LVТI и инициализаторы null, экземплярные переменные и переменные блоков catch . . . 194 ....................................................................................... Инструкция try с объявлением ресурса . . . 194 ........................................................... 97. LVТI и обобщенные типы Т . . . 195 ............................................................................... 98. LV ТI, подстановочные знаки, коварианты и контраварианты . . 196 ......................... LV TI и подстановочные знаки . . . 196 ......................................................................... LV ТI и коварианты/контраварианты . . . 197 .............................................................. Резюме . . . . . . 198 ............................................................................................................................. Глава 5. Массивы, коллекции и структуры данных ................................................... 199 Задачи 199 .................................................................................................................................... Решения . . . . 201 ............................................................................................................................. 99. Сортировка массива . . . . . . 201 ......................................................................................... Решения, встроенные в JDK . . . . . . 202 ......................................................................... Другие алгоритмы сортировки . 204 .......................................................................... 100. Поиск элемента в массиве . . 213 .................................................................................. Проверка только присутствия элемента . 214 ........................................................... Проверка только первого индекса .. . . 217 . ................................................................. 101. Проверка эквивалентности или несовпадения двух массивов . . . 218 ...................... Проверка эквивалентности двух массивов 218 ........................................................ Проверка несовпадения в двух массивах . . 220 ......................................................... 102. Сравнение двух массивов лексикографически .. . . . . 221 .. .......................................... 103. Создание потока из массива 223 ................................................................................ 104. Минимальное, максимальное и среднее значения массива . 224 ............................. Вычисление максимума и минимума . . . 225 .............................................................. Вычисление среднего значения . . . 227 ....................................................................... 105. Инвертирование массива . . 227 ................................................................................... 1 Об. Заполнение и настройка массива . . . . . . 229 .................................................................. 107. Следующий больший элемент . . . 231 .......................................................................... 108. Изменение размера массива . . . 232 ............................................................................. 109. Создание немодифицируемых/немутируемых коллекций . . 233 ............................. Задача 1 ( Collections.unmodifiaЫeList( )) ............................................................. 233 Задача 2 (Arrays.asList()) ..................................................................................... 234 Задача 3 (Collections.unmodifiaЬleList() и статический блок) 234 ........................... Задача 4 (List.of( )) ................................................................................................. 235 Задача 5 (немутируемое) ..................................................................................... 236 110. Возврат значения по умолчанию из коллекции Мар 238 ......................................... [ 9 ]