Руководство по Java Core. Базовые операторы. – PROSELYTE

Для манипулирования переменными в языке Java предусмотренно множество операторов. Все операторы мы модем поделить на такие группы:

  • Арифметические операторы
  • Операторы сравнения
  • Битовые операторы
  • Логические операторы
  • Операторы присваивания
  • Другие

Рассмотрим эти группы отдельно.


Арифметические операторы

Этот тип операторов используется для математических операций.

Представим, что у нас есть две целочисленные переменные (int) A = 50, B = 20.

Примеры:

+ (Сложение) A + B = 70
– (Вычитание)A – B = 30
* (Умножение)A * B = 1000
/ (Деление)A / B = 2
% (Остаток от деления)A % B = 10
++ (Инкремент)A++ = 51
— (Декремент)B– = 19

Операторы сравнения

Результатом оператора сравнения является логический тип boolean, который говорит нам, является ли данное утверждение правдой (true) или ложью (false).

Представим, что у нас есть две целочисленные переменные (int) A = 50, B = 20.

Примеры:

== (Равен) (A == B) -> false
!= (Не равен)
(A != B) -> true
> (Больше, чем)(A > B) -> true
< (Меньше, чем)(A < B) -> false
>= (Больше, чем или равно)(A >= B) -> true
<= (Меньше, чем или равно)(A <= B) -> false

Битовые операторы

В языке Java существует ряд битовых операторов, которые поддерживают целочисленные типы данных.

Битовые операторы позволяют нам выполнять побитовые операции.

Представим, что у нас есть две целочисленные переменные (int) A = 50, B = 20. B) -> 0010 0110~ (Побитовое дополнение)( ~A ) -> 1100 1101
<< (Побитовый сдвиг влево)(A << 1) -> 100 (0110 0100)
>> (Побитовый сдвиг вправо)(B >> 2) -> 5 (0000 0101)
>>> (Побитовый сдвиг вправо с присвоением)

( A >>> 3) -> 6 (0000 0110)

Логические операторы

В языке Java поддерживаются 3 логических оператора, все они приведены таблице ниже.

Представим, что у нас есть две логические переменные (boolean) T = true и F = false.

&& (Логическое ‘И’)    (A && B) -> false
|| (Логическое ‘ИЛИ’)   (A || B) -> true
! (Логическое ‘НЕ’)
   !(A || B) -> false

Операторы присваивания

В языке Java есть 11 операторов присваивания. Рассмотрим их на примерах.

Представим, что у нас есть две целочисленные переменные (int) A = 50, B = 20 и некая переменная С, значение которой, пока не присвоено.

=
   С = A + B ( C == 70 )
+=   A += B (A == 70)
-=
   A -= B (A == 30)
*=   B *= A (B == 1000)
/=   A /= B (A == 2)
%=
   A %= B (A == 10)
<<=
   B <<= 2 (B == 80)
>>=
   A >>= 2 (A == 12)
&=   B &= 2 (B = B & 2 )
^=
   A ^= 2 (A == 48)
|=   A |= 3 (A == 51)

Другие

К другим операторам в языке Java относится только 1. Это тернарный оператор ветвления IF.

Более подробно мы рассмотрим IF далее, а пока приведём общую форму записи:

Допустим у нас есть логическая переменная (boolean) isActive, значение которой нам неизвестно.

Пример:

int a = (isActive) ? 100 : 200.

Разъяснение:

Если isActive = true, тогда a = 100.

Если isActive = false, тогда a = 200.


В этом уроке мы рассмотрели операторы для манипулирования переменными в языке Java.

Более подробно с операторами в языке Java можно ознакомиться в спецификации языка Java (Java Language Specification).

В следующем уроке мы рассмотрим массивы в языке Java и их виды.

Тернарный оператор Java за три минуты

Тернарный оператор является формой синтаксического сахара для операторов if- else . Он также известен как условный оператор, который, возможно, является более значимым именем, потому что он оценивает условия, как if делал. При условии, что оператор используется осторожно, он может сделать код более кратким, не жертвуя удобочитаемостью.

Эта статья требует от вас четкого понимания того, как if заявления работают в Java .

Троичный оператор

Тернарный оператор оценивает условие и выбирает одну из двух ветвей для выполнения. Как и во многих других языках программирования ? и : символы используются для его формирования. Другие распространенные имена, с которыми вы можете столкнуться, которые относятся к одному и тому же понятию, являются встроенными if , троичными if и условными операторами .

Синтаксис

Название троичного относится к тому факту, что оператор берет три операнда.

condition ? exprTrue : exprFalse 

condition является логическим выражением, которое оценивается как true или false . И exprTrue и exprFalse также являются выражениями, но они могут вычислять все, что вы хотите ( кроме void ). Если условие true , троичный оператор вычисляет exprTrue . В противном случае exprFalse оценивается.

Тернарный оператор — это выражение (например, price + 20 ), которое означает, что после выполнения оно имеет значение. И это значение необходимо использовать в дальнейшем, например, присваивая его переменной или возвращая из метода, иначе выражение не скомпилируется.

Стоит отметить, что оператор ленив в том смысле, что вычисляется только используемое выражение: троичный оператор не будет оценивать неиспользуемую ветвь.

Примеры

Как видите, базовая структура очень похожа на оператор if else- else но она сведена в одну строку. Давайте посмотрим на конкретный пример. Он демонстрирует, как простой оператор if else- else может быть заменен тернарным оператором.

int price; if (isPremiumMember()) { price = 80; } else { price = 100; } // is equivalent to int price = isPremiumMember() ? 80 : 100; 

Переменная price получает значение в зависимости от того, является ли пользователь премиум-членом или нет. Как видите, троичный оператор является кратким и в этом случае улучшает читаемость.

Поскольку вы можете использовать его как выражение, часто это позволяет вам удалить несколько операторов return в методе, заменив их одним выражением.

int price() { if (isPremiumMember()) { return 80; } else { return 100; } } 

Можно заменить на

int price() { return isPremiumMember() ? 80 : 100; } 

Метод пересмотренных price значительно короче и разборчивее, чем раньше.

Вложение нескольких операторов

Java позволяет вложить один условный оператор в другой. Будьте осторожны при этом, хотя. Вложенные условные операторы могут препятствовать удобочитаемости.

int amount = 10; String result = amount <= 2 ? "couple" : amount > 2 && amount < 5 ? "few" : amount <= 5 ? "several" : "many"; 

Хотя этот пример можно улучшить с помощью форматирования, иногда лучше избегать использования тернарного оператора и переходить к обычному старому маршруту if -thense или switch .

Резюме

Вы узнали, что троичный оператор позволяет сократить оператор if else else to до однострочного condition ? exprTrue : exprFalse condition ? exprTrue : exprFalse . Если все сделано правильно, это делает код более лаконичным и улучшает читабельность.

Однако меньшее количество строк кода не всегда лучше . Легко злоупотребить троичным оператором и сделать ваш код менее читабельным . Придерживайтесь здравого смысла и имейте в виду, что программы должны быть написаны для того, чтобы люди могли читать, и только для того, чтобы машины выполнялись . Более читаемый способ выражения условий, особенно если их много, может быть оператором switch .

Операторы (Учебники по Java™ > Изучение языка Java > Основы языка)

«Предыдущая • След. • Следующая»

Теперь, когда вы узнали, как объявлять и инициализировать переменные, вы, вероятно, захотите узнать, как что-то делать с ними. Изучение операторов языка программирования Java — хорошее начало. Операторы — это специальные символы, которые выполняют определенные операции с одним, двумя или тремя операндами , а затем возвращают результат.

Пока мы изучаем операторы языка программирования Java, вам может быть полезно заранее знать, какие операторы имеют наивысший приоритет. Операторы в следующей таблице перечислены в порядке приоритета. Чем ближе к началу таблицы появляется оператор, тем выше его приоритет. Операторы с более высоким приоритетом оцениваются перед операторами с относительно более низким приоритетом. Операторы в одной строке имеют одинаковый приоритет. Когда в одном и том же выражении появляются операторы с одинаковым приоритетом, должно определяться правило, которое вычисляется первым. Все бинарные операторы, кроме операторов присваивания, вычисляются слева направо; операторы присваивания вычисляются справа налево.

Приоритет оператора
Операторы Приоритет
постфикс выражение ++ выражение --
одинарный ++ выражение -- выражение + выражение - выражение ~ !
мультипликатив * / %
добавка + - 9= |= <<= >= >>>=

В программировании общего назначения одни операторы встречаются чаще, чем другие; например, оператор присваивания « = » встречается гораздо чаще, чем беззнаковый оператор сдвига вправо « >>> «. Имея это в виду, последующее обсуждение сначала сосредоточится на операторах, которые вы, скорее всего, будете использовать на регулярной основе, а затем сосредоточитесь на тех, которые менее распространены. Каждое обсуждение сопровождается примером кода, который вы можете скомпилировать и запустить. Изучение его результатов поможет закрепить то, что вы только что узнали.

« Предыдущий • Тащить • Далее »

Написание Kubernetes с помощью Java Operator SDK

Java Operator SDK, или JOSDK, — это проект с открытым исходным кодом, цель которого — упростить задачу создания операторов Kubernetes с помощью Java. Проект был начат компанией Container Solutions, а Red Hat в настоящее время является основным участником.

В этой статье вы получите краткий обзор того, что такое операторы и почему может быть интересно создавать их на Java. В следующей статье будет показано, как создать простого оператора с помощью JOSDK.

Как вы можете догадаться, эта серия статей в основном предназначена для разработчиков Java, заинтересованных в написании операторов на Java. Вам не нужно быть экспертом в Operators, Kubernetes или Quarkus. Тем не менее, базовое понимание всех этих тем поможет. Чтобы узнать больше, я рекомендую прочитать серию Red Hat Developer Kubernetes Operators 101.

Операторы Kubernetes: краткое введение

Kubernetes стал де-факто стандартной платформой для развертывания облачных приложений. По своей сути Kubernetes основывается на простой идее: пользователь сообщает состояние, в котором он хочет, чтобы кластер был, и платформа будет стремиться реализовать эту цель. Пользователю не нужно сообщать Kubernetes, как туда добраться; им просто нужно указать, как должно выглядеть желаемое конечное состояние. Как правило, это включает в себя предоставление кластеру материализованной версии этого желаемого состояния в виде файлов JSON или YAML, отправляемых в кластер для рассмотрения с помощью 9Инструмент 0027 kubectl . Предполагая, что желаемое состояние допустимо, как только оно появится в кластере, оно будет обрабатываться контроллерами . Контроллеры — это процессы, которые выполняются в кластере и отслеживают связанные ресурсы, чтобы согласовать их фактическое состояние с состоянием, желаемым пользователем.

Несмотря на эту концептуальную простоту, фактическая работа с кластером Kubernetes — нетривиальная задача для неопытных пользователей. Примечательно, что развертывание и настройка приложений Kubernetes обычно требует создания нескольких ресурсов, связанных между собой иногда сложными отношениями. В частности, разработчики, у которых может не быть опыта эксплуатации, часто сталкиваются с трудностями при перемещении своих приложений из локальной среды разработки в конечную облачную среду. Таким образом, уменьшение этой сложности принесет огромные выгоды пользователям, особенно за счет инкапсуляции необходимых операционных знаний в форме автоматизации, с которой пользователи, менее знакомые с платформой, смогут взаимодействовать на более высоком уровне. Именно для этого были разработаны операторы Kubernetes.

Пользовательские ресурсы

Kubernetes поставляется с механизмом расширения в виде пользовательских ресурсов (CR), которые позволяют пользователям расширять платформу Kubernetes аналогично тому, как реализована базовая платформа. Формальной разницы между тем, как обрабатываются нативные и настраиваемые ресурсы, не так много: оба определяют предметно-ориентированные языки (DSL), управляющие одним конкретным аспектом платформы, реализуемым представлениями ресурсов YAML или JSON. В то время как собственные ресурсы управляют аспектами, которые являются частью платформы, через связанные с ними контроллеры, пользовательские ресурсы предоставляют еще один уровень поверх этих собственных ресурсов, позволяя пользователям, например, определять абстракции более высокого уровня.

Однако платформа ничего не знает об этих пользовательских ресурсах, поэтому пользователи должны сначала зарегистрировать контроллер на платформе для их обработки. Комбинация пользовательского DSL, определяемого ресурсами, и связанного с ним контроллера позволяет пользователям определять словари, которые ближе к их бизнес-модели. Они могут сосредоточиться на специфических для бизнеса аспектах своего приложения, а не беспокоиться о том, как конкретное состояние будет реализовано в кластере; последняя задача находится в ведении соответствующего диспетчера. Этот шаблон позволяет инкапсулировать операционные знания, реализованные соответствующим контроллером, за DSL, предоставляемым пользовательским ресурсом. Вот что такое операторы: реализации этого полезного шаблона.

Таким образом, операторы весьма привлекательны для тех, кто хочет сократить объем знаний, необходимых для развертывания приложений, но при этом автоматизировать повторяющиеся шаги. Они предлагают организациям возможность инкапсулировать бизнес-правила или процессы с помощью декларативного «языка», выраженного пользовательскими ресурсами, используя словарь, адаптированный к поставленной задаче, вместо того, чтобы иметь дело с собственными ресурсами Kubernetes, которые незнакомы менее техническим пользователям. После того, как оператор установлен и настроен в кластере, логика и автоматизация, которые он обеспечивает, становятся доступными для пользователей кластера, которым нужно иметь дело только с соответствующим DSL.

Зачем писать операторы на Java?

Kubernetes и его экосистема написаны на языке программирования Go, как и операторы. Хотя нет необходимости писать все на одном языке, также реальностью является то, что экосистема оптимизирована для разработчиков Go. Справедливости ради стоит отметить, что Go хорошо подходит для этой задачи: язык относительно прост в освоении и предлагает хорошие характеристики времени выполнения как с точки зрения использования памяти, так и использования процессора. Более того, несколько проектов Go нацелены на упрощение процесса написания Оператора:

  • operator-sdk и его инструмент командной строки помогают разработчикам быстрее начать работу
  • client-go упрощает программное взаимодействие с сервером Kubernetes API
  • apimachinery и controller-runtime предлагают полезные утилиты и шаблоны

Если Go так хорош для написания операторов, зачем кому-то делать это на Java? Во-первых, Java — это язык, на котором написано значительное количество корпоративных приложений. Эти приложения традиционно очень сложны по своей природе, и компании, которые полагаются на них, выиграют от упрощенных способов их развертывания и эксплуатации в масштабе кластеров Kubernetes.

Более того, философия DevOps требует, чтобы разработчики также несли ответственность за развертывание в рабочей среде, обслуживание и другие эксплуатационные аспекты жизненного цикла своего приложения. С этой точки зрения возможность использовать один и тот же язык на всех этапах жизненного цикла является привлекательным предложением.

Наконец, компании, ориентированные на Java и желающие написать Kubernetes Operators, хотят извлечь выгоду из существующего богатого опыта Java среди своих разработчиков. Если разработчики могут быстро освоить язык программирования, который они уже знают, вместо того, чтобы тратить время и энергию на изучение нового, это дает существенное преимущество.

Java в облаке?

Тем не менее, если написание операторов на Java дает так много преимуществ, почему другие компании не делают этого? Первая причина, которая приходит на ум, заключается в том, что по сравнению с Go Java традиционно была довольно слабой, когда дело доходит до развертывания в облаке. Действительно, Java — это платформа, которая десятилетиями оттачивалась для обеспечения производительности на долго работающих серверах. В этом контексте использование памяти или медленное время запуска обычно не являются проблемой. Этот конкретный недостаток постепенно устранялся с течением времени, но факт остается фактом: типичное приложение Java будет использовать больше памяти и запускаться медленнее, чем приложение Go. Это имеет большое значение в облачной среде, в которой модуль, в котором работает ваше приложение, может быть уничтожен в любое время (подход «скот против домашних животных») и где вам может потребоваться быстрое масштабирование (в частности, в бессерверных средах). Потребление памяти также влияет на плотность развертывания: чем больше памяти потребляет ваше приложение, тем сложнее развернуть несколько его экземпляров в одном кластере с ограниченными ресурсами.

Было начато несколько проектов по улучшению пригодности Java для облачных сред, среди которых Quarkus, которому посвящена эта серия статей. Проект Quarkus описывает себя как «родной для Kubernetes стек Java, адаптированный для OpenJDK HotSpot и GraalVM, созданный на основе лучших в своем классе библиотек и стандартов Java». Перенося большую часть обработки, которая обычно выполняется традиционными стеками Java во время выполнения (например, обработку аннотаций, анализ файлов свойств, самоанализ), во время сборки, Quarkus повышает производительность приложений Java с точки зрения как потребляемой памяти, так и времени запуска. Используя проект GraalVM, он также упрощает нативную компиляцию Java-приложений, делая их конкурентоспособными с приложениями Go и практически исключая из уравнения характеристики времени выполнения.

Как насчет поддержки фреймворка?

Однако, как мы уже отмечали, даже если мы не принимаем во внимание характеристики времени выполнения, Go — привлекательный язык для написания операторов, в немалой степени благодаря экосистеме фреймворка, которую он предлагает для поддержки такой задачи. . Хотя существуют Java-клиенты, которые конкурируют с проектом client-go , помогая взаимодействовать с сервером Kubernetes, эти клиенты предоставляют только низкоуровневые абстракции, в то время как экосистема Go предоставляет высокоуровневые фреймворки и утилиты, предназначенные для разработчиков операторов.

Вот тут-то и появляется JOSDK, предлагающий среду, сравнимую с тем, что Controller-runtime предлагает разработчикам Go, но адаптированную для разработчиков Java и использующую идиомы Java. JOSDK стремится облегчить задачу разработки операторов Java, предоставляя структуру, которая обрабатывает низкоуровневые события и реализует лучшие практики и шаблоны, что позволяет разработчикам сосредоточиться на бизнес-логике своего оператора, а не беспокоиться о низкоуровневых операциях, необходимых для взаимодействия. с API-сервером Kubernetes.

Признавая, что Quarkus особенно хорошо подходит для развертывания Java-приложений, в частности операторов, в облаке, Red Hat продвинула JOSDK на один шаг вперед, интегрировав его в quarkus-operator-sdk , расширение Quarkus, упрощающее работу с Java.