Что делает в java
Перейти к содержимому

Что делает в java

  • автор:

Java: Операторы

Перед тем, как двигаться дальше, разберем базовую терминологию. Знак операции, такой как + , называют оператором. Оператор — просто символ, который выполняет операцию, например, сложение:

System.out.println(8 + 2); // => 10 

В этом примере + — это оператор, а числа 8 и 2 — это операнды.

В случае сложения у нас есть два операнда:

  • Один слева
  • Другой справа от знака +

Операции, которые требуют наличия двух операндов, называются бинарными. Если пропустить хотя бы один операнд, то программа завершится с синтаксической ошибкой. Например:

Операции бывают не только бинарными. Бывают еще:

  • Унарные — с одним операндом
  • Тернарные — с тремя операндами

Причем операторы могут выглядеть одинаково, но обозначать разные операции:

System.out.println(-3); // => -3 

Выше пример применения унарной операции к числу 3. Оператор «минус» перед тройкой говорит интерпретатору — возьми число 3 и найди противоположное, то есть -3.

Это немного может сбить с толку, потому что -3 — это одновременно и число само по себе, и оператор с операндом, но у языков программирования такая структура.

Задание

Напишите программу, которая посчитает разность между числами 6 и -81 и выведет ответ на экран.

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

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

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

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

Определения

  • Арифметическая операция — сложение, вычитание, умножение и деление.
  • Оператор — специальный символ, создающий операцию. Например, + создает операцию сложения.
  • Операнд — объект, который участвует в операции. 3 * 6 : здесь 3 и 6 — операнды.
  • Унарная операция — операция с одним операндом. Например, -3 — унарная операция для получения числа, противоположного числу три.
  • Бинарная операция — операция с двумя операндами. Например, 3 + 9 .

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics

Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе

  • Привет, Мир!
  • Комментарии
  • Инструкции (Statements)
  • Как мы проверяем ваши решения
  • Ошибки оформления (синтаксиса)
  • Арифметические операции
  • Операторы
  • Коммутативная операция
  • Композиция операций
  • Приоритет операций
  • Числа с плавающей точкой
  • Линтер
  • Кавычки
  • Экранирующие последовательности
  • Конкатенация
  • Что такое переменная
  • Изменение переменной
  • Выбор имени переменной
  • Ошибки при работе с переменными
  • Выражения в определениях
  • Переменные и конкатенация
  • Именование переменных
  • Магические числа
  • Константы
  • Зачем нужны типы данных
  • Явная типизация
  • Какие бывают типы
  • Значение null
  • Явное преобразование типов
  • Методы и их вызов
  • Параметры методов
  • Вызов метода — выражение
  • Неизменяемость строк
  • Цепочки вызовов методов
  • Детерминированность
  • Стандартная библиотека
  • Какие бывают методы
  • Создание (определение) метода
  • Метод main
  • Возврат значений
  • Определение методов
  • Необязательные параметры методов
  • Логический тип
  • Сравнение строк
  • Комбинирование операций и методов
  • Логические операторы
  • Отрицание
  • Условная конструкция (if)
  • Конструкция if-else
  • Конструкция else if
  • Тернарный оператор
  • Конструкция Switch
  • Цикл While
  • Агрегация данных (Числа)
  • Агрегация данных (Строки)
  • Обход строк
  • Условия внутри тела цикла
  • Формирование строк в циклах
  • Синтаксический сахар
  • Инкремент и декремент
  • Возврат из циклов
  • Цикл For

Что значит ? значит на Java 1 мин для чтения

Pimp My Ride встречает Алана Уэйка в новой игре на выживание в автомобиле

Favorite

Добавить в избранное

Чему программисты на Java должны научиться в 2021 году

Java предоставляет широкий спектр операторов, таких как оператор присваивания «=» , оператор приращения « ++ », оператор декремента «–» и так далее. Возможно, вы слышали обо всех этих операторах, но слышали ли вы когда-нибудь о троичном «?» оператор? Что ж, это не что иное, как альтернативный вариант оператора if-else, который также известен как условный оператор. Более того, использование вложенного тернарного оператора «?» предоставляет функциональные возможности операторов switch.

В этой статье мы собираемся исследовать различные аспекты оператора «?»:

  • Что означает «?» в Java
  • Синтаксис
  • Как «?» работает на Java
  • Как использовать вложенный «?» на Java

Что значит «?» в Java

«?» в java — это не что иное, как оператор, который работает так же, как выполняются операторы if-else, и поэтому он более известен как условный или тернарный оператор в java. «?» в java помогают нам писать простой, лаконичный и понятный код.

Синтаксис

Тернарный или условный оператор состоит из двух символов: один из них — «?» а другой — «:» , и вместе эти два символа образуют выражение:

(condition/expression) ? first-expression : second-expression

Из приведенного выше фрагмента видно, что всего имеется три экземпляра, т. е. конкретное условие и два выражения.

Как работает «?» на Java

Как «?» оператор работает аналогично операторам if-else, поэтому сначала он проверяет условие.

  • Если true, то будет выполнено первое выражение.
  • Если false, то будет выполнено второе выражение.

Давайте рассмотрим приведенные ниже примеры для глубокого понимания того, как «?» оператор работает в java или как он заменяет оператор if-else.

Пример

Фрагмент ниже проверит условие, используя оператор if-else, чтобы узнать, является ли предоставленное число четным или нечетным:

publicclassTernaryOperatorExample < publicstaticvoidmain(String[] args) < int number = 35; if (number % 2 == 0) < System.out.println("Вы ввели четное число"); >else < System.out.println("Вы ввели нечетное число"); >> >

Читать Стоит ли изучать Java в 2021 году и на перспективу

Данное число будет разделено на 2, если в остатке 0, то будет показано четное число, в противном случае — нечетное число.

Вывод подтверждает правильность оператора if-else.

Пример

Теперь давайте выполним приведенный выше пример с помощью оператора «?»:

publicclassTernaryOperatorExample < publicstaticvoidmain(String[] args) < int number = 35; String res = (number % 2 == 0) ? "Четное число" :"Нечетное число"; System.out.println(res); >>

Использование оператора ? делает наш код кратким и легким для понимания. Приведенный выше фрагмент кода подтверждает работу оператора «?».

Как использовать вложенный «?» на Java

Иногда мы сталкиваемся со сценарием, в котором нам нужно пройти через несколько условий, в таких случаях мы должны использовать несколько операторов «?» и, следовательно, известны как вложенные троичные «?». Рассмотрим приведенный ниже пример для глубокого понимания этой концепции.

Пример

В этом примере есть три числа и среди них мы должны найти большее число:

publicclassTernaryOperatorExample < publicstaticvoidmain(String[] args) < int num1 = 51, num2 = 45, num3 = 55; int res = (num1 >= num2) ? ((num1 >= num3) ? num1 : num3) : ((num2 >= num3) ? num2 : num3); System.out.println("Большее число - это: " + res); > >

В приведенном выше фрагменте кода мы применяем вложенный тернарный оператор, чтобы найти наибольшее число среди заданных чисел и сохранить результат в переменной «res».

Вышеприведенный фрагмент кода покажет, что «55» больше, чем «51» и «45» , что показывает, что вложенный оператор «?» работает эффективно.

Вывод

В Java «?» известен как тернарный/условный оператор, и он работает так же, как и операторы if-else. «?» в java включает три экземпляра, т.е. конкретное условие и два выражения. Если указанное условие истинно, то будет выполнено первое выражение, иначе будет выполнено второе выражение. В случае нескольких условий можно использовать вложенный тернарный оператор. Эта статья представляет собой подробное руководство об операторе «?», что он означает в java, и как использовать «?» символ в java.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Оператор двойного двоеточия в Java 8

Оператор двойного двоеточия (::) в Java 8 — это нововведение, которое может вызвать затруднения у новичков. Он представляет собой ссылку на метод или конструктор и может быть очень полезным для сокращения кода.

Пример использования оператора двойного двоеточия

Возьмем обычный пример, где используется анонимный класс Runnable для создания нового потока:

new Thread(new Runnable() < @Override public void run() < System.out.println("Hello from new thread"); >>).start();

Тот же код с использованием ссылки на метод через оператор двойного двоеточия выглядит так:

new Thread(System.out::println).start();

Это значительно упрощает код и делает его более читаемым.

Понимание оператора ::

Оператор двойного двоеточия (::) в Java 8 — это ссылка на метод. Он используется для передачи метода в качестве параметра в другой метод. Это очень похоже на указатели на функции в других языках, таких как С++. Однако в Java нет прямых указателей, а оператор :: обеспечивает безопасный и удобный способ ссылки на метод.

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

Например, в коде Math::max оператор :: используется для ссылки на статический метод max из класса Math . Этот метод принимает два параметра типа int и возвращает максимальное из двух чисел. Это соответствует функциональному интерфейсу IntBinaryOperator , который ожидает два параметра типа int и возвращает int .

Вывод

Оператор двойного двоеточия (::) — это мощное нововведение в Java 8, которое облегчает работу с методами и конструкторами. Он делает код более чистым и упрощает его чтение и понимание.

Кофе-брейк #155. 10 главных функций в языке Java

Java-университет

Кофе-брейк #155. 10 главных функций в языке Java - 1

Источник: DZone В этой статье перечисляются десять функций программирования на языке Java, которые часто используются разработчиками в их повседневной работе.

1. Фабричный метод в коллекциях (Collection Factory Method)

Коллекции — одна из наиболее часто используемых функций в программировании. Они используются как контейнер, в котором мы храним объекты и передаем их дальше. Коллекции также используются для сортировки, поиска и повторения объектов, что заметно упрощает жизнь программиста. Они имеют несколько основных интерфейсов, таких как List, Set, Map, а также несколько реализаций. Традиционный способ создания Collections и Maps может показаться многим разработчикам многословным. Поэтому в Java 9 появилось несколько лаконичных фабричных методов. List:

 List countries = List.of("Bangladesh", "Canada", "United States", "Tuvalu"); 

Set:

 Set countries = Set.of("Bangladesh", "Canada", "United States", "Tuvalu"); 

Map:

 Map countriesByPopulation = Map.of("Bangladesh", 164_689_383, "Canada", 37_742_154, "United States", 331_002_651, "Tuvalu", 11_792); 

Фабричный метод очень удобен, когда мы хотим создать неизменяемые контейнеры. Но если вы собираетесь создавать изменяемые коллекции, рекомендуется использовать традиционный подход.

2. Вывод локального типа (Local Type Inference)

В Java 10 добавили вывод типов для локальных переменных. До этого разработчикам приходится дважды указывать типы при объявлении и инициализации объекта. Это было очень утомительно. Посмотрите на следующий пример:

 Map> properties = new HashMap<>(); 

Здесь указан тип информации с обеих сторон. Если же мы определим его в одном месте, то читатель кода и компилятор Java легко поймут, что это должен быть тип Map. Вывод локального типа делает именно это. Вот пример:

 var properties = new HashMap>(); 

Теперь все пишется только один раз и код выглядит не намного хуже. А когда мы вызываем метод и сохраняем результат в переменной, то код становится еще короче. Пример:

 var properties = getProperties(); 
 var countries = Set.of("Bangladesh", "Canada", "United States", "Tuvalu"); 

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

3. Расширенные выражения Switch

Традиционный оператор switch существовал в Java с самого начала и тогда он напоминал C и C++. Это было нормально, но по мере развития языка этот оператор не предлагал нам никаких улучшений, вплоть до Java 14. Конечно, у него были и некоторые недостатки. Самым печально известным было проваливание (fall-through): Чтобы решить эту проблему, разработчики использовали операторы break, которые в значительной степени представляют собой шаблонный код. Однако в Java 14 появилась усовершенствованная версия оператора switch с гораздо большим перечнем функций. Теперь нам больше не нужно добавлять операторы break, и это решает проблему провала. Кроме того, оператор switch может возвращать значение, что означает, что мы можем использовать его как выражение и присваивать его переменной.

 int day = 5; String result = switch (day) < case 1, 2, 3, 4, 5 ->"Weekday"; case 6, 7 -> "Weekend"; default -> "Unexpected value: " + day; >; 

4. Записи

Хотя Записи (Records) — это относительно новая функция, появившаяся в Java 16, многие разработчики находят ее очень полезной, главным образом благодаря созданию неизменяемых объектов. Часто нам нужны объекты данных в нашей программе для хранения или передачи значений из одного метода в другой. Например, класс для переноса координат x, y и z, который мы запишем следующим образом:

 package ca.bazlur.playground; import java.util.Objects; public final class Point < private final int x; private final int y; private final int z; public Point(int x, int y, int z) < this.x = x; this.y = y; this.z = z; >public int x() < return x; >public int y() < return y; >public int z() < return z; >@Override public boolean equals(Object obj) < if (obj == this) return true; if (obj == null || obj.getClass() != this.getClass()) return false; var that = (Point) obj; return this.x == that.x && this.y == that.y && this.z == that.z; >@Override public int hashCode() < return Objects.hash(x, y, z); >@Override public String toString() < return "Point[" + "x=" + x + ", " + "y=" + y + ", " + "z language-java line-numbers"> package ca.bazlur.playground; public record Point(int x, int y, int z)

5.Optional

Метод — это контракт, в котором мы обозначаем условия. Мы указываем параметры с их типом, а также возвращаемый тип. Затем мы ожидаем, что при вызове метода он будет вести себя в соответствии с контрактом. Однако часто мы получаем null из метода вместо значения указанного типа. Это ошибка. Чтобы ее устранить, инициатор обычно проверяет значение с условием if, независимо от того, является ли это значение нулевым или нет. Пример:

 public class Playground < public static void main(String[] args) < String name = findName(); if (name != null) < System.out.println("Length of the name : " + name.length()); >> public static String findName() < return null; >> 

Посмотрите на приведенный выше код. Предполагается, что метод findName возвратит значение String , но он возвращает null. Инициатор теперь должен сначала проверить nulls, чтобы справиться с проблемой. Если инициатор забывает сделать это, то в конечном итоге мы получим NullPointerException . С другой стороны, если бы сигнатура метода указывала на возможность невозвращения значения, то это решило бы всю путаницу. И вот тут нам может помочь Optional .

 import java.util.Optional; public class Playground < public static void main(String[] args) < OptionaloptionalName = findName(); optionalName.ifPresent(name -> < System.out.println("Length of the name : " + name.length()); >); > public static Optional findName() < return Optional.empty(); >> 

Здесь мы переписали метод findName с Optional , в котором указана возможность не возвращать никакого значения. Это заранее предупреждает программистов и устраняет проблему.

6. Java Date Time API

  • LocalDate
  • LocalTime
  • LocalDateTime
  • Duration
  • Period
  • ZonedDateTime
 import java.time.LocalDate; import java.time.Month; public class Playground3 < public static void main(String[] args) < LocalDate date = LocalDate.of(2022, Month.APRIL, 4); System.out.println("year = " + date.getYear()); System.out.println("month = " + date.getMonth()); System.out.println("DayOfMonth = " + date.getDayOfMonth()); System.out.println("DayOfWeek = " + date.getDayOfWeek()); System.out.println("isLeapYear language-java line-numbers"> LocalTime time = LocalTime.of(20, 30); int hour = time.getHour(); int minute = time.getMinute(); time = time.withSecond(6); time = time.plusMinutes(3); 

Добавление часового пояса:

 ZoneId zone = ZoneId.of("Canada/Eastern"); LocalDate localDate = LocalDate.of(2022, Month.APRIL, 4); ZonedDateTime zonedDateTime = date.atStartOfDay(zone); 

7.NullPointerException

Каждый разработчик ненавидит исключение NullPointerException. Особенно сложно бывает, когда StackTrace не предоставляет полезной информации, в чем именно заключается проблема. Чтобы это продемонстрировать, давайте взглянем на пример кода:

 package com.bazlur; public class Main < public static void main(String[] args) < User user = null; getLengthOfUsersName(user); >public static void getLengthOfUsersName(User user) < System.out.println("Length of first name: " + user.getName().getFirstName()); >> class User < private Name name; private String email; public User(Name name, String email) < this.name = name; this.email = email; >//getter //setter > class Name < private String firstName; private String lastName; public Name(String firstName, String lastName) < this.firstName = firstName; this.lastName = lastName; >//getter //setter > 

Посмотрите на основной метод в этом отрывке. Мы видим, что далее появится NullPointerException . Если мы запустим и скомпилируем код в версии до Java 14, то получим следующий StackTrace:

 Exception in thread "main" java.lang.NullPointerException at com.bazlur.Main.getLengthOfUsersName(Main.java:11) at com.bazlur.Main.main(Main.java:7) 

Здесь очень мало информации, где и почему возникло исключение NullPointerException . А вот в Java 14 и более поздних версиях мы получаем гораздо больше сведений в StackTrace, что очень удобно. В Java 14 мы увидим:

 Exception in thread "main" java.lang.NullPointerException: Cannot invoke "ca.bazlur.playground.User.getName()" because "user" is null at ca.bazlur.playground.Main.getLengthOfUsersName(Main.java:12) at ca.bazlur.playground.Main.main(Main.java:8) 

8. CompletableFuture

Мы пишем программы построчно, и обычно они выполняются построчно. Но бывают случаи, когда нам нужно параллельное выполнение, чтобы сделать программу быстрее. Для этого мы обычно используем Java Thread. Программирование потоков Java не всегда связано с параллельным программированием. Вместо этого оно дает нам возможность составить несколько независимых модулей программы, которые будут выполняться независимо и часто даже асинхронно. Однако программирование потоков довольно сложное, особенно для новичков. Вот почему Java 8 предлагает более простой API, который позволяет выполнять часть программы асинхронно. Давайте посмотрим пример. Предположим, нам нужно вызвать три REST API, а затем объединить результаты. Мы можем вызывать их по одному. Если каждый из них занимает около 200 миллисекунд, то общее время для их получения займет 600 миллисекунд. А что, если бы мы могли запускать их параллельно? Поскольку современные процессоры обычно многоядерны, они могут легко обрабатывать три вызова rest на трех разных процессорах. Используя CompletableFuture, мы легко можем это сделать.

 package ca.bazlur.playground; import java.time.Duration; import java.time.Instant; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; public class SocialMediaService < public static void main(String[] args) throws ExecutionException, InterruptedException < var service = new SocialMediaService(); var start = Instant.now(); var posts = service.fetchAllPost().get(); var duration = Duration.between(start, Instant.now()); System.out.println("Total time taken: " + duration.toMillis()); >public CompletableFuture> fetchAllPost() < var facebook = CompletableFuture.supplyAsync(this::fetchPostFromFacebook); var linkedIn = CompletableFuture.supplyAsync(this::fetchPostFromLinkedIn); var twitter = CompletableFuture.supplyAsync(this::fetchPostFromTwitter); var futures = List.of(facebook, linkedIn, twitter); return CompletableFuture.allOf(futures.toArray(futures.toArray(new CompletableFuture[0]))) .thenApply(future ->futures.stream() .map(CompletableFuture::join) .toList()); > private String fetchPostFromTwitter() < sleep(200); return "Twitter"; >private String fetchPostFromLinkedIn() < sleep(200); return "LinkedIn"; >private String fetchPostFromFacebook() < sleep(200); return "Facebook"; >private void sleep(int millis) < try < TimeUnit.MILLISECONDS.sleep(millis); >catch (InterruptedException e) < throw new RuntimeException(e); >> >

9. Лямбда-выражения

Лямбда-выражения, пожалуй, – самая мощная функция языка Java. Они изменили то, как мы пишем код. Лямбда-выражение похоже на анонимную функцию, которая может принимать аргументы и возвращать значение. Мы можем присвоить функцию переменной и передать ее методу в качестве аргументов, а метод может ее вернуть. У него есть тело. Единственное отличие от метода в том, что здесь нет имени. Выражения короткие и лаконичные. Обычно они не содержат большого количества шаблонного кода. Давайте посмотрим пример, в котором нам нужно перечислить все файлы в каталоге с расширением .java.

 var directory = new File("./src/main/java/ca/bazlur/playground"); String[] list = directory.list(new FilenameFilter() < @Override public boolean accept(File dir, String name) < return name.endsWith(".java"); >>); 

Если внимательно посмотреть на этот отрывок кода, то мы передали в метод анонимный внутренний класс list() . А во внутренний класс мы поместили логику для фильтрации файлов. По сути, нас интересует именно эта часть логики, а не шаблон вокруг логики. Лямбда-выражение позволяет нам удалить весь шаблон, и мы можем написать код, который нас интересует. Вот пример:

 var directory = new File("./src/main/java/ca/bazlur/playground"); String[] list = directory.list((dir, name) -> name.endsWith(".java")); 

Конечно, это только один пример, у лямбда-выражения есть много других преимуществ.

10. Stream API

В нашей повседневной работе одной из распространенных задач является обработка набора данных. В ней существует несколько общих операций, таких как фильтрация, преобразование и сбор результатов. До Java 8 такие операции были императивными по своей сути. Мы должны были написать код для нашего намерения (то есть, чего мы хотели достичь) и как бы мы этого хотели бы сделать. С изобретением лямбда-выражения и Stream API теперь мы можем записывать функции обработки данных декларативно. Мы только указываем свое намерение, и нам не нужно записывать, как мы получаем результат. Вот пример: У нас есть список книг, и мы хотим найти все имена книг по Java, разделенные запятыми и отсортированные.

 public static String getJavaBooks(List books) < return books.stream() .filter(book ->Objects.equals(book.language(), "Java")) .sorted(Comparator.comparing(Book::price)) .map(Book::name) .collect(Collectors.joining(", ")); > 

Приведенный выше код прост, удобочитаем и лаконичен. А вот ниже можно увидеть альтернативный императивный код:

 public static String getJavaBooksImperatively(List books) < var filteredBook = new ArrayList(); for (Book book : books) < if (Objects.equals(book.language(), "Java"))< filteredBook.add(book); >> filteredBook.sort(new Comparator() < @Override public int compare(Book o1, Book o2) < return Integer.compare(o1.price(), o2.price()); >>); var joiner = new StringJoiner(","); for (Book book : filteredBook) < joiner.add(book.name()); >return joiner.toString(); > 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *