JavaStart
876 subscribers
924 photos
28 videos
631 links
Учи Java вместе с нами!
Наша платформа с курсом - https://javastart.tech
Ютуб с обучающими видео - https://www.youtube.com/@javastart_tech
Download Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5💯4👍1
Как из 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