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%
Посмотреть ответ
👍3✍2🎉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💯3✍2
Please open Telegram to view this post
VIEW IN TELEGRAM
Что напечатает код выше?
Anonymous Quiz
20%
true true true
14%
true true false
5%
true false false
14%
false false false
31%
true false true
5%
Exception будет
12%
Посмотреть ответ
✍4👍2🎉1
🔍 Ответ на задачу про сравнение строк в Java
Давайте разберемся, что напечатает приведённый код!
Этот код выводит на экран:
true — В первом сравнении (a == b), оба операнда являются строковыми литералами, и компилятор оптимизирует их, так что они указывают на один и тот же объект в строковом пуле.
false — Во втором сравнении (a == d), d создается путем конкатенации на этапе выполнения, из-за чего она не будет указывать на тот же объект в строковом пуле, что и a.
true — В третьем сравнении (a.equals(d)), метод equals сравнивает содержимое строк, а не их ссылки, потому этот результат будет true, так как содержимое одинаково.
Интересно, правда? 😄 Не забудьте, что использование оператора == для сравнения строк может привести к неожиданным результатам. Для проверки эквивалентности строк на уровне содержимого всегда используйте equals. ✅
✅ JavaStart. Подписаться
Давайте разберемся, что напечатает приведённый код!
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. ✅
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6✍2👨💻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. Подписаться
Ключевое слово 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).
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👍3✍1
Что обязательно переопределить вместе с 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
Что “получаешь из коробки”, объявляя record Point(int x, int y)?
Anonymous Quiz
6%
Только геттеры
8%
Только конструктор
14%
Полный сет геттеров/сеттеров
53%
equals, hashCode, toString и геттеры-компоненты
19%
Посмотреть ответ
✍3👍2🎉2
ООП, Полиморфизм в Java простыми словами. Часть 1.
Полиморфизм, если перевести, - это значит "много форм". Например, актер в театре может примерять на себя много ролей - или принимать "много форм".
Так же и наш код - благодаря полиморфизму он становится более гибким, чем в языках программирования, которые не используют принципы ООП.
Переопределение методов родителя.
Когда мы наследуем какой-либо класс, мы наследуем и все его методы. Но если нам хочется изменить какой-либо из методов, который мы наследуем, мы можем всего-навсего переопределить его.
Мы не обязаны, например, создавать отдельный метод с похожим названием для наших нужд, а унаследованный метод будет без дела лежать в нашем классе.
Именно то, что мы можем создать в классе-наследнике класс с таким же названием, как и класс, который мы унаследовали от родителя, и называется переопределением.
Представим, что у нас есть такая структура как на Картинке.
Вверху иерархии классов стоит класс Animal. Его наследуют два класса - Cat и Dog.
У класса "Animal" есть метод "голос" (voice). Этот метод выводит на экран сообщение "Голос".
Естественно, ни собака, ни кошка не говорят "Голос" 🙂 Они гавкают и мяукают. Соответственно, нам нужно задать другой метод для классов Cat и Dog - чтобы кошка мяукала, а собака гавкала.
Поэтому, в классах-наследниках мы переопределяем метод voice(), чтобы мы в консоли получали "Мяу" и "Гав".
Обратите внимание: перед методом, который мы переопределяем, пишем @Override. Это дает понять компилятору, что мы хотим переопределить метод.
Тем не менее, полиморфизм - это принцип. Все реальные примеры, которые можно привести - это только способы реализации полиморфизма. Рассмотрим еще пример в одном из след постах.
✅ JavaStart. Подписаться
Полиморфизм, если перевести, - это значит "много форм". Например, актер в театре может примерять на себя много ролей - или принимать "много форм".
Так же и наш код - благодаря полиморфизму он становится более гибким, чем в языках программирования, которые не используют принципы ООП.
Переопределение методов родителя.
Когда мы наследуем какой-либо класс, мы наследуем и все его методы. Но если нам хочется изменить какой-либо из методов, который мы наследуем, мы можем всего-навсего переопределить его.
Мы не обязаны, например, создавать отдельный метод с похожим названием для наших нужд, а унаследованный метод будет без дела лежать в нашем классе.
Именно то, что мы можем создать в классе-наследнике класс с таким же названием, как и класс, который мы унаследовали от родителя, и называется переопределением.
Представим, что у нас есть такая структура как на Картинке.
Вверху иерархии классов стоит класс Animal. Его наследуют два класса - Cat и Dog.
У класса "Animal" есть метод "голос" (voice). Этот метод выводит на экран сообщение "Голос".
Естественно, ни собака, ни кошка не говорят "Голос" 🙂 Они гавкают и мяукают. Соответственно, нам нужно задать другой метод для классов Cat и Dog - чтобы кошка мяукала, а собака гавкала.
Поэтому, в классах-наследниках мы переопределяем метод voice(), чтобы мы в консоли получали "Мяу" и "Гав".
Обратите внимание: перед методом, который мы переопределяем, пишем @Override. Это дает понять компилятору, что мы хотим переопределить метод.
Тем не менее, полиморфизм - это принцип. Все реальные примеры, которые можно привести - это только способы реализации полиморфизма. Рассмотрим еще пример в одном из след постах.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3✍2👨💻2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3✍2💯2👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4😁4👨💻2👍1
Что напечатает код выше?
Anonymous Quiz
37%
"1"
24%
"null"
8%
Пустую строку
22%
Будет Exception
10%
Посмотреть ответ
✍4👍3🎉1
🔍 Ответ на задачу про исключение в стримах Java!
При выполнении данного кода возникнет исключение NullPointerException.
Давайте разберём, почему это происходит 🤔
Проблема возникает в строчке 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. Подписаться
При выполнении данного кода возникнет исключение 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.
Please open Telegram to view this post
VIEW IN TELEGRAM
✍2👍2🔥1👨💻1