Java 17 для тех, кто не следил. Часть 2: API |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2022-05-01 20:10 Если обновляешься со старой Java на LTS-версию Java 17, как разобраться сразу во всех фичах за несколько лет? Чтобы помочь с этим, мы уже публиковали расшифровку доклада Тагира Валеева с нашего IT-фестиваля TechTrain. Но доклад такой подробный, что разделили его на два текста: в предыдущем была основная часть про языковые изменения, а теперь представляем вам завершающую часть про API. Далее повествование идёт от лица спикера. Давайте посмотрим интересные новые API, которые появились после Java 11. Кстати, в документации Java 17 появилась вкладочка New, где перечислено всё новое со времён Java 11: новые модули, пакеты, интерфейсы и так далее. Можно сесть вечерком и спокойно почитать. Я расскажу про то, что мне самому понравилось. String.indent В Java 12 в строках появился новый метод для отбивки её пробелами после каждого перевода строк. В качестве примера вот можно красиво форматировать наше синтаксическое дерево для отладочного вывода: Здорово, что в строках много разных новых интересных методов, и вам не нужны всякие странные классы типа String.stripIndent Появился несколько обратный метод Его основное предназначение — это помощь в реализации text blocks. В спецификации прямо так и написано, что в блоках лишнее выравнивание убирается этим методом. Если вы вдруг пишете свой парсер Java-файлов, вам не надо греть голову, как их правильно обрезать, можно просто вызвать этот метод. String.translateEscapes Часть этой же истории — это метод String str = " Hello World"; System.out.println(str); System.out.println(str.translateEscapes()); Hello World Hello World Я завёл строчку, транслировал и получил нормальную табуляцию и нормальный перевод строки. Math.absExact В математике появился долгожданный метод Очень удобно, обязательно пользуйтесь. Stream.teeing В Stream API после Java 11 появился метод Например, вы хотите усреднить стрим Stream.mapMulti Ещё в стримах появился немного странный метод Stream.of("hello", "world") .<Character>mapMulti((str, sink) -> { for (char c : str.toCharArray()) { sink.accept(c); } }) .forEach(System.out::printIn); Тут я просто разбиваю строку на символы и эти символы туда пихаю. Тут даже короткое замыкание по API не сделаешь, потому что если у нас там был стрим с каким-нибудь Stream.of("hello", "world") .<Character>mapMulti((str, sink) -> { for (char c : str.toCharArray()) { sink.accept(c); } }) .forEach(System.out::printIn); Stream.of("hello", "world") .flatMap(s -> s.chars().mapToObj(c -> (char) c)) .forEach(Syatem.out::printIn); В данном случае то же самое можно сделать с Классический пример — это размотка List<Optional<String>> optionals = IntStream.range(0, 1000) .mapToObj(i -> Optional.of(i).filter(v -> v%2 == 0).map(String::valueOf)) .toList(); Классическое решение в стиле Java 8 — это вызвать последовательно фильтры В Java 9 появился метод Теперь можно взять Какой же доклад без бенчмарков. Что же будет быстрее? Выясняется, что mapMulti побеждает всех. И памяти тоже требует меньше, где FlatMap отстаёт вообще на два порядка. Но мне кажется, что если ваш код со стримами действительно вас не устраивает с точки зрения производительности, то уж проще на цикл переписать, наверное? Императивно, без всяких лямбд и стримов. Получается ещё быстрее, аллокаций нет вообще. В общем, мне не очень понятно, зачем нужен HexFormat HexFormat format = HexFormat .ofDelimiter(":") .withUpperCase() .withPrefix("[") .withSuffix("]"); byte[] input = {(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE}; String asString = format.formatHex(input); System.out.printIn(asString); // [CA]:[FE]:[BA]:[BE] byte[] output = format.parseHex(asString); assert Arrays.equals(input, output); Ещё один классный метод, который появился в Java 17, это А главное — можно не только форматировать, но и парсить. Такой красивый и современный API. А ещё он супербыстрый, внешняя библиотека вряд ли сможет работать так же быстро. ByteBuffer absolute positioning ByteBuffer.slice(index, length); ByteBuffer.get(index, byteArray); ByteBuffer.get(index, byteArray, offset, length); ByteBuffer.put(index, byteArray); ByteBuffer.put(index, byteArray, offset, length); Bytebuffer.put(index, byteBuffer, offset, length); CharBuffer/DoubleBuffer/FloatBuffer/IntBuffer/LongBuffer/ShortBuffer Прокачали Objects.check для long Objects.checkIndex(long index, long length); Objects.checkFromToIndex(long fromIndex, long toIndex, long length); Objects.checkFromIndexSize(long fromIndex, long size, long length); Всё чаще появляется необходимость работать с массивами данных, количество элементов в которых превышает два миллиарда и не влазит в int. Если вы пропустили, то в Java 9 появились удобные быстрые методы для проверки того, попадает ли индекс в диапазон индексов. Если вы пишете, например, свою реализацию А если вы вдруг работаете с огромными данными, они в int не влазят, и у вас всех на long, то в Java 16 появились соответствующие методы для них. Специалисты по Big Data могут радоваться — теперь вы можете обрабатывать очень много данных в Java. RandomGeneratorFactory RandomGenerator generator = RandomGeneratorFactory .of("L128X1024MixRandom") .create(); int randomNumber = generator.nextInt(1, 100); System.out.printIn("Extremely good random number between 1 and 100: " + randomNumber); Кстати, о бигдате: если вам нужно очень много хороших случайных чисел, появился дополнительный повод обновиться до Java 17. В ней кардинально переработали всю историю со случайными числами — был добавлен целый пакет Кроме того, туда напихали целую кучу алгоритмов, потому что генератор, который существует в Java с незапамятных времен, В Java 8 появились Кстати, подобную табличку можно сгенерировать прямо из API в вашей JVM, если там есть какие-то новые генераторы, то вы всех их можете увидеть, потому что можно просто получить стрим всех генераторов и читать про разные их свойства. Вот я сделал табличку, в неё interface RandomGenerator DoubleStream doubles(...) IntStream ints(...) LongStream longs(...) boolean next Boolean() void nextBytes(byte[]) float nextFloat(...) double nextDouble(...) int nextInt(...) long nextLong(...) double nextGaussian(...) double nextExponential() А самая классная вещь, что над всеми генераторами случайных чисел появился общий интерфейс, и именно его теперь нужно использовать в сигнатурах методов, которым для нормального функционирования нужна случайность. Тогда вы снаружи контролируете, какой генератор можно передать. В интерфейсе есть всё, что необходимо: все привычные методы, которые мы видели раньше в Reference.refersTo Иногда возникает задача проверить, указывает ли данная ссылка на конкретный объект. Старый способ был просто сделать
Process + Reader В классе Заметьте, кстати, что это новый API, у них нет префикса Кое-что для японцев Ну и конечно, если среди вас есть японцы, поздравляю вас с началом новой эры REIWA, которую добавили в Java 13. Впрочем, это изменение не совсем в тему нашего доклада, потому что это одно из немногих добавлений в API, которую бэкпортировали не только в Java 11, но и в Java 8. Зато, когда этот вопрос обсуждался, я неожиданно понял, что среди всех правителей земного шара император Японии оказывает наибольшее влияние на Java. Если вы думаете, что добавить новую эру — это просто пара строчек, то ой нет. Там около 20 тикетов, связанных с этим. Так что не надо недооценивать Японию. На этом у меня всё. Источник: m.vk.com Комментарии: |
|