Три разновидности циклов в Java

Источник: Medium Ознакомившись с этой публикацией, вы узнаете о различных способах выполнения циклов в языке Java. Кофе-брейк #154. Три разновидности циклов в Java. JDK 19: новые возможности Java 19, которые появятся в сентябре - 1Цикл (Loop) предназначен для выполнения блока кода до тех пор, пока условие не станет истинным. В языке Java существует три разновидности циклов:
  • while
  • do-while
  • for

While loop

Цикл while повторяется до тех пор, пока заданное логическое условие не станет true. Как показано на диаграмме ниже, оператор будет выполняться до тех пор, пока проверка условия не отобразит true. Кофе-брейк #154. Три разновидности циклов в Java. JDK 19: новые возможности Java 19, которые появятся в сентябре - 2

Синтаксис


while (condition true) {
       // Блок кода
}

Пример

Здесь цикл while будет выполняться до тех пор, пока условие не станет true для x, меньшего 3.

public class WhileLoop {
     static int x = 1;
     public static void main(String[] args) {
         while(x < 3) {
             System.out.println("x = "+x);
             x++;
         }
     }
}
Вывод:
x = 1 x = 2

Цикл do-while

Цикл do-while похож на цикл while с одним небольшим отличием. Цикл do-while всегда выполняется один раз перед проверкой условия. Кофе-брейк #154. Три разновидности циклов в Java. JDK 19: новые возможности Java 19, которые появятся в сентябре - 3

Синтаксис


do {
     //  Блок кода
   } while(condition);

Пример

На этом примере вы видите, что оператор do или блок кода всегда выполняются один раз перед проверкой истинности или ложности условия.

static int x = 5;
        public static void main(String[] args) {
            do {
                System.out.println("x = "+x);
                x++;
            } while(x < 3);
        }
Вывод
x = 5

Цикл for

Цикл for сильно отличается от цикла while и do-while. В одной строке оператора мы определяем инициализацию, условие (true или false), увеличение/уменьшение. Кофе-брейк #154. Три разновидности циклов в Java. JDK 19: новые возможности Java 19, которые появятся в сентябре - 4

Синтаксис


For (initialization; condition; increment/decrement) {
    // Блок кода
}

Пример


public static void main(String[] args) {
     for(int i = 0 ; i < 2 ; i++) {
         System.out.println("i = " + i);
     }
}
Вывод:
i = 0 i = 1
Инициализация: int i = 0 является условием инициализации цикла. Условие: происходит проверка, верно ли условие для запуска блока или кода внутри цикла for. Если условие false, то это завершит цикл. Увеличение/уменьшение: обновление переменной для следующей итерации.

Расширенный цикл for (for-each)

Существует еще один вариант цикла for, более компактный и читабельный, чем простой цикл for. Он называется расширенным циклом for (или циклом for-each) и используется для перебора коллекций и массивов. Он доступен любому объекту, реализующему интерфейс Iterable.

Пример


class Main
{
    public static void main(String[] args)
    {
        int[] A = { 1, 2, 3, 4, 5 };
 
        for (int i: A) {
            System.out.println(i);
        }
    }
}
Вывод:
1 2 3 4 5

JDK 19: новые возможности Java 19, которые появятся в сентябре

Источник: Infoworld Вашему вниманию представлен перечень новых функций, которые появятся в ближайшем релизе JDK. Его выпуск намечен на 20 сентября 2022 года. Java Development Kit 19, выпуск с краткосрочной поддержкой, который должен появиться в сентябре, достиг стадии релиз-кандидата. В нем следует обратить внимание на семь функций: структурированный параллелизм, шаблоны записей, предварительная версия функции foreign и memory API, а также поддержка архитектуры набора инструкций Linux/RISC-V (ISA) с открытым исходным кодом. Поскольку добавление новых функций для JDK 19 уже заморожено, другие запланированные возможности, такие как универсальные дженерики и объекты-значения, отложены для более поздней версии платформы. Обычно новая версия Java выходит каждые шесть месяцев. Релиз-кандидат JDK 19 опубликован 11 августа, до этого в июне и июле ему предшествовали два rampdown-релиза. Второй релиз-кандидат ожидается 25 августа. Ранние сборки JDK 19 можно загрузить на странице jdk.java.net/19. Функции JDK 19 включают в себя:
  • Структурированный параллелизм (на этапе инкубации). Он предназначен для упрощения многопоточного программирования с помощью API структурированного параллелизма. Этот параллелизм рассматривает несколько задач, выполняемых в разных потоках, как единую единицу работы. Соответственно, это упростит обработку ошибок и отмену, также будет улучшена надежность.

  • Предварительная версия шаблонов записей (для разбора значений записей). Шаблоны записей (Record patterns) и шаблоны типов теперь могут быть вложены друг в друга, что обеспечивает декларативную, мощную и компонуемую форму навигации и обработки данных. Новая функция включает расширение сопоставления шаблонов для выражения более сложных составных запросов данных без изменения синтаксиса или семантики шаблонов типов.

    Это нововведение основано на сопоставлении шаблонов для instanceof, представленном в JDK 16 в марте 2021 года. В будущих релизах может потребоваться расширение шаблонов записей с помощью таких возможностей, как шаблоны массивов и шаблоны vararg.

    Шаблоны записей являются частью проекта Amber, направленного на изучение и развитие небольших функций Java, ориентированных на производительность.

  • Предварительные версии функции foreign и memory API. В новом релизе появится API, с помощью которого Java-программы могут взаимодействовать с кодом и данными вне среды выполнения Java. Благодаря эффективному вызову сторонних функций (то есть кода вне JVM) и безопасному доступу к чужой памяти (памяти, не управляемой JVM) API позволит программам Java вызывать собственные библиотеки и обрабатывать собственные данные без недостатков Java Native Interface (JNI).

    Функция foreign и memory API объединяют два более ранних инкубационных API: API доступа к внешней памяти и API внешнего компоновщика. Функция foreign и memory API ранее инкубировались в JDK 17 и повторно инкубировались в JDK 18.

  • Предварительная версия виртуальных потоков (Virtual threads). Эта функция представляет собой облегченные потоки, которые значительно сокращают усилия по написанию, обслуживанию и наблюдению за высокопроизводительными параллельными приложениями. Целью нововведения является обеспечение возможности масштабирования серверных приложений, написанных в простом стиле “поток на запрос” (thread-per-request). Функция предназначена для кода, в котором используется java.lang Thread API для внедрения виртуальных потоков с минимальными изменениями, а также для устранения неполадок, отладки и профилирования виртуальных потоков с помощью существующих инструментов JDK.

  • Третья предварительная версия сопоставления шаблонов для просмотра выражений и операторов switch (pattern matching for switch expressions and statements). Она расширяет сопоставление шаблонов до switch, что позволит тестировать выражение по ряду шаблонов, каждый из которых имеет определенное действие, поэтому сложные запросы, ориентированные на данные, могут быть выражены лаконично и безопасно.

    Эта функция ранее была предварительно представлена ​​в JDK 17 и JDK 18. В третьей предварительной версии добавлены улучшения, включая замену защищенных шаблонов when предложениями в switch-блоках. Кроме того, runtime-семантика шаблона switch, когда значение выражения селектора равно null, теперь поддерживает устаревшую семантику switch.

    Нововведение расширит выразительность и применимость switch-выражений и операторов, позволяя шаблонам появляться в метках case. Также разработчики получат возможность ослабить историческую враждебность к null и switch, когда это необходимо, улучшается безопасность switch-операторов и обеспечивается возможность, чтобы существующие switch-выражения и операторы продолжали компилироваться без изменений и выполнялись с идентичной семантикой.

  • Четвертая инкубация vector API. Она будет выражать векторные вычисления, которые надежно компилируются во время выполнения в оптимальные векторные инструкции на поддерживаемых архитектурах процессоров. Это обеспечит более высокую производительность по сравнению с эквивалентными скалярными вычислениями. Разработчики, использующие API, получают возможность писать сложные векторные алгоритмы на Java, используя автовекторизатор HotSpot, но с пользовательской моделью, которая делает векторизацию более предсказуемой и надежной. Векторный API ранее был инкубирован в JDK 16, JDK 17 и JDK 19.

    Vector API расширит побитовые интегральные линейные операции, в том числе такие операции, как подсчет количества единичных битов, изменение порядка битов на обратный, а также сжатие и расширение битов.

  • Порт Linux/RISC-V Java получит поддержку набора аппаратных инструкций, который уже поддерживается широким спектром языковых наборов инструментов. Теперь порт Linux/RISC-V будет поддерживать конфигурацию RV64GV RISC-V, 64-разрядную ISA общего назначения, которая включает векторные инструкции.

    Также порт получит поддержку следующих параметров виртуальной машины HotSpot: интерпретатор шаблонов, JIT-компилятор C1 (клиент), JIT-компилятор C2 (сервер) и все текущие основные сборщики мусора, включая ZGC и Shenandoah.