JavaStart
876 subscribers
924 photos
28 videos
631 links
Учи Java вместе с нами!
Наша платформа с курсом - https://javastart.tech
Ютуб с обучающими видео - https://www.youtube.com/@javastart_tech
Download Telegram
Как из List<List<Integer>> получить плоский List<Integer> с помощью Stream API?
Anonymous Quiz
52%
flatMap(List::stream)
18%
map(List::stream)
3%
reduce(Integer::sum)
11%
collect(Collectors.toMap(...))
15%
Посмотреть ответ
👍32🎉2👨‍💻1
Какой уровень изоляции транзакций предотвращает “phantom reads”?
Anonymous Quiz
17%
READ COMMITTED
21%
REPEATABLE READ
44%
SERIALIZABLE
10%
READ UNCOMMITTED
8%
Посмотреть ответ
3👍3🎉2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3😁3💯32
Что напечатает код?

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
🔍 Ответ на задачу про сравнение строк в Java

Давайте разберемся, что напечатает приведённый код!

String a = "ab";
String b = "a" + "b";
String c = "a";
String d = c + "b";

System.out.println(a == b);
System.out.println(a == d);
System.out.println(a.equals(d));


Этот код выводит на экран:

true — В первом сравнении (a == b), оба операнда являются строковыми литералами, и компилятор оптимизирует их, так что они указывают на один и тот же объект в строковом пуле.

false — Во втором сравнении (a == d), d создается путем конкатенации на этапе выполнения, из-за чего она не будет указывать на тот же объект в строковом пуле, что и a.

true — В третьем сравнении (a.equals(d)), метод equals сравнивает содержимое строк, а не их ссылки, потому этот результат будет true, так как содержимое одинаково.

Интересно, правда? 😄 Не забудьте, что использование оператора == для сравнения строк может привести к неожиданным результатам. Для проверки эквивалентности строк на уровне содержимого всегда используйте equals.

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62👨‍💻2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5💯4👍1
IS-A отношения в Java простыми словами. Часть 2.

Ключевое слово instanceof.

Для определения типа объекта (является ли конкретный объект является типом другого объекта) в Java используется ключевое слово instanceof.

Давайте посмотрим на код на Картинках.

Объект m класса Mammal является типом объекта Animal, потому что класс Mammal наследуется от супер-класса Animals.

Объект d класса Dog является типом объекта Mammal, потому что класс Dog наследуется от класса Mammal.

При этом объект d класса Dog еще и является типом объекта Animal, потому что класс Mammal наследуется от класса Animal.

Как уже говорилось ранее - в Java нет множественного наследования (class X extends Y, Z, …), но классы могут наследоваться по цепочке (class X extends Y, class Y extends Z).

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3👨‍💻2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5👍31
Что обязательно переопределить вместе с equals() для корректной работы в HashSet/HashMap?
Anonymous Quiz
0%
clone()
5%
compareTo()
92%
hashCode()
0%
finalize()
3%
Посмотреть ответ
2👍2🎉2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3😁3💯2
Как правильно логировать параметры через SLF4J?
Anonymous Quiz
56%
log.info("User id: {}", id)
1%
log.info("User id="+id)
19%
log.info(String.format("User id: %d", id))
19%
log.info("User id: %s", id);
4%
Посмотреть ответ
3👍3🎉1
ООП, Полиморфизм в Java простыми словами. Часть 1.

Полиморфизм, если перевести, - это значит "много форм". Например, актер в театре может примерять на себя много ролей - или принимать "много форм".

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

Переопределение методов родителя.

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

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

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

Представим, что у нас есть такая структура как на Картинке.

Вверху иерархии классов стоит класс Animal. Его наследуют два класса - Cat и Dog.

У класса "Animal" есть метод "голос" (voice). Этот метод выводит на экран сообщение "Голос".

Естественно, ни собака, ни кошка не говорят "Голос" 🙂 Они гавкают и мяукают. Соответственно, нам нужно задать другой метод для классов Cat и Dog - чтобы кошка мяукала, а собака гавкала.

Поэтому, в классах-наследниках мы переопределяем метод voice(), чтобы мы в консоли получали "Мяу" и "Гав".

Обратите внимание: перед методом, который мы переопределяем, пишем @Override. Это дает понять компилятору, что мы хотим переопределить метод.

Тем не менее, полиморфизм - это принцип. Все реальные примеры, которые можно привести - это только способы реализации полиморфизма. Рассмотрим еще пример в одном из след постах.

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32👨‍💻2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁32💯2👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4😁4👨‍💻2👍1
Что напечатает код?

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻3👍2
4👍3🎉1
🔍 Ответ на задачу про исключение в стримах Java!

При выполнении данного кода возникнет исключение NullPointerException.

Давайте разберём, почему это происходит 🤔

public static class Fee {     
    private String description;    

    public Fee(String description) {
        this.description = description;
    }    

    public String getDescription() {
        return description;
    }
}

public static void main(String[] args) {
    List<Fee> fees = List.of(new Fee(null));
    String s = fees.stream()
            .map(Fee::getDescription)
            .findFirst()
            .orElse("1");
    System.out.println(s);
}


Проблема возникает в строчке findFirst(). Метод .map(Fee::getDescription) создаёт стрим, где первый элемент имеет значение null из-за description равного null в объекте Fee.

Когда findFirst() пытается вернуть найденное значение — а это null — метод Optional.of() выбрасывает NullPointerException, поскольку Optional.of() не позволяет обёртывать null значениями. Для обработки null значений нужно использовать Optional.ofNullable().

Чтобы исправить это и избежать исключения, можно немного изменить этот код:

String s = fees.stream()
        .map(Fee::getDescription)
        .filter(Objects::nonNull) // добавляем этот фильтр
        .findFirst()
        .orElse("1");

Этот код сначала фильтрует все null значения из стрима и предотвращает NullPointerException.

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2🔥1👨‍💻1
ООП, Полиморфизм в Java простыми словами. Часть 2. Перегрузка методов.

Рассмотрим на практическом примере как проявляется полиморфизм, а потом снова вернемся к его определению.

Полиморфизм часто часто описывают фразой: Один интерфейс - много методов.

Но что это значит? Как проявляется полиморфизм?

Дело в том, что если бы в Java не было принципа полиморфизма, компилятор бы интерпретировал код на Картинке 1 как ошибку.

Как видите, методы на картинке отличаются значениями, которые они принимают:

первый принимает int, а второй принимает short.

Однако, поскольку в Java используется принцип полиморфизма (один из принципов ООП), компилятор не будет воспринимать это как ошибку, потому что такие методы будут считаться разными (Картинка 1).

Называть методы одинаково - это очень удобно. Например, если у нас есть метод, который ищет корень квадратный из числа, гораздо легче запомнить одно название (например, sqrt()), чем по одному отдельному названию на этот же метод, написанный для каждого типа (Картинка 2).

Как видите, мы не должны придумывать отдельное название для каждого метода - а главное их запоминать!

Это предполагает, что мы можем заполнить одно название (один интерфейс), по которому мы сможем обращаться к нескольким методам, меняя лишь аргументы.

Теперь Вы можете понять, почему часто этот принцип описывают фразой: Один интерфейс - много методов.

Перегрузка методов.

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

Все это - проявления "повышенной гибкости" объектно-ориентированного языка Java благодаря полиморфизму.

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32👨‍💻2