Не знаю у кого как, но моя кошка именно так и делает. И выглядит порой 😂 😂
https://t.me/Java_for_beginner_dev
#Mems
https://t.me/Java_for_beginner_dev
#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Что такое reflection в Java?
Что такое reflection в Java?
Anonymous Quiz
4%
Это механизм для работы с файлами.
4%
Это механизм для работы с коллекциями.
4%
Это механизм для создания потоков.
87%
Это механизм для анализа и изменения структуры классов во время выполнения.
Методы and, or, negate класса Predicate и их использование
Метод and
Метод and позволяет комбинировать два Predicate с помощью логического оператора "И". Результирующий Predicate вернет true, только если оба исходных Predicate вернут true.
Пример:
Метод or
Метод or комбинирует два Predicate с помощью логического оператора "ИЛИ". Результирующий Predicate вернет true, если хотя бы один из исходных Predicate вернет true.
Пример:
Метод negate
Метод negate возвращает Predicate, который является логическим отрицанием исходного. Если исходный Predicate возвращает true, то negate вернет false, и наоборот.
Пример:
Пример использования комбинированных Predicate в Stream API
Теперь давайте рассмотрим пример, где мы используем комбинированные Predicate для фильтрации данных.
Или укороченный (и предпочтительный) вариант:
#Java #Training #Medium #Functional_programming #Predicate #and #or #negate
Метод and
Метод and позволяет комбинировать два Predicate с помощью логического оператора "И". Результирующий Predicate вернет true, только если оба исходных Predicate вернут true.
Пример:
Predicate<Integer> isEven = number -> number % 2 == 0;
Predicate<Integer> isGreaterThan10 = number -> number > 10;
// Комбинируем два Predicate
Predicate<Integer> isEvenAndGreaterThan10 = isEven.and(isGreaterThan10);
System.out.println(isEvenAndGreaterThan10.test(12)); // true
System.out.println(isEvenAndGreaterThan10.test(8)); // false
Метод or
Метод or комбинирует два Predicate с помощью логического оператора "ИЛИ". Результирующий Predicate вернет true, если хотя бы один из исходных Predicate вернет true.
Пример:
Predicate<String> startsWithA = name -> name.startsWith("A");
Predicate<String> endsWithE = name -> name.endsWith("e");
// Комбинируем два Predicate
Predicate<String> startsWithAOrEndsWithE = startsWithA.or(endsWithE);
System.out.println(startsWithAOrEndsWithE.test("Alice")); // true
System.out.println(startsWithAOrEndsWithE.test("Eve")); // true
System.out.println(startsWithAOrEndsWithE.test("Bob")); // false
Метод negate
Метод negate возвращает Predicate, который является логическим отрицанием исходного. Если исходный Predicate возвращает true, то negate вернет false, и наоборот.
Пример:
Predicate<Integer> isEven = number -> number % 2 == 0;
// Создаем отрицание Predicate
Predicate<Integer> isOdd = isEven.negate();
System.out.println(isOdd.test(5)); // true
System.out.println(isOdd.test(4)); // false
Пример использования комбинированных Predicate в Stream API
Теперь давайте рассмотрим пример, где мы используем комбинированные Predicate для фильтрации данных.
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class CombinedPredicateExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// Создаем Predicate для четных чисел и чисел больше 5
Predicate<Integer> isEven = number -> number % 2 == 0;
Predicate<Integer> isGreaterThan5 = number -> number > 5;
// Комбинируем Predicate
Predicate<Integer> isEvenAndGreaterThan5 = isEven.and(isGreaterThan5);
// Фильтруем список с помощью Stream API
List<Integer> filteredNumbers = numbers.stream()
.filter(isEvenAndGreaterThan5)
.collect(Collectors.toList());
System.out.println(filteredNumbers); // [6, 8, 10]
}
}
В этом примере мы комбинируем два Predicate с помощью метода and, чтобы отфильтровать только четные числа, которые больше 5.
Или укороченный (и предпочтительный) вариант:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class CombinedPredicateExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> filteredNumbers = numbers.stream()
.filter(number -> number % 2 == 0 && number > 5)
.collect(Collectors.toList());
System.out.println(filteredNumbers); // [6, 8, 10]
}
}
#Java #Training #Medium #Functional_programming #Predicate #and #or #negate
Интерфейс Consumer<T> и метод accept
Consumer<T> — это функциональный интерфейс, представленный в Java 8 в пакете java.util.function. Он используется для выполнения действий над объектом типа T, не возвращая никакого результата. Интерфейс имеет один абстрактный метод accept(T t), который принимает объект типа T и выполняет над ним некоторое действие.
Как работает метод accept?
Метод accept — это основной метод интерфейса Consumer. Он принимает объект типа T и выполняет над ним некоторое действие. Результатом выполнения метода является void, то есть метод не возвращает никакого значения.
Пример:
Плюсы и минусы использования Consumer
Плюсы:
Упрощает код, делая его более читаемым и выразительным.
Позволяет легко выполнять действия над объектами, особенно в сочетании с Stream API.
Поддерживает лямбда-выражения, что делает код более компактным.
Минусы:
Может быть избыточным для простых действий, где можно обойтись обычным методом.
Требует понимания функционального программирования для эффективного использования.
Пример использования Consumer для выполнения действий над объектами
Один из самых распространенных сценариев использования Consumer — это выполнение действий над элементами коллекции.
#Java #Training #Medium #Functional_programming #Consumer #accept
Consumer<T> — это функциональный интерфейс, представленный в Java 8 в пакете java.util.function. Он используется для выполнения действий над объектом типа T, не возвращая никакого результата. Интерфейс имеет один абстрактный метод accept(T t), который принимает объект типа T и выполняет над ним некоторое действие.
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
Как работает метод accept?
Метод accept — это основной метод интерфейса Consumer. Он принимает объект типа T и выполняет над ним некоторое действие. Результатом выполнения метода является void, то есть метод не возвращает никакого значения.
Пример:
Consumer<String> printUpperCase = str -> System.out.println(str.toUpperCase());
printUpperCase.accept("hello"); // HELLO
Здесь мы создали Consumer, который принимает строку и выводит ее в верхнем регистре. Метод accept применяется к строке "hello", и результат выводится на экран.
Плюсы и минусы использования Consumer
Плюсы:
Упрощает код, делая его более читаемым и выразительным.
Позволяет легко выполнять действия над объектами, особенно в сочетании с Stream API.
Поддерживает лямбда-выражения, что делает код более компактным.
Минусы:
Может быть избыточным для простых действий, где можно обойтись обычным методом.
Требует понимания функционального программирования для эффективного использования.
Пример использования Consumer для выполнения действий над объектами
Один из самых распространенных сценариев использования Consumer — это выполнение действий над элементами коллекции.
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class ConsumerExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eve");
// Создаем Consumer для вывода имен в верхнем регистре
Consumer<String> printUpperCase = name -> System.out.println(name.toUpperCase());
// Применяем Consumer к каждому элементу списка
names.forEach(printUpperCase);
}
}
В этом примере мы используем Consumer для вывода каждого имени из списка в верхнем регистре. Метод forEach принимает Consumer и применяет его к каждому элементу списка.
#Java #Training #Medium #Functional_programming #Consumer #accept
Что выведет код?
#Tasks
import java.util.TreeMap;
public class Task290125 {
public static void main(String[] args) {
TreeMap<String, Integer> map = new TreeMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);
map.put("date", 4);
System.out.println(map.lowerKey("banana"));
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Что такое serialization в Java?
Что такое serialization в Java?
Anonymous Quiz
74%
Это процесс преобразования объекта в поток байтов.
12%
Это процесс создания потоков.
2%
Это процесс работы с коллекциями.
12%
Это процесс работы с файлами.
Более сложные сценарии использования Consumer
Метод andThen
Метод andThen позволяет комбинировать два Consumer таким образом, что сначала выполняется первый Consumer, а затем второй. Это полезно, когда нужно выполнить несколько действий над одним объектом.
Пример:
Пример использования Consumer в Stream API
Consumer часто используется в Stream API для выполнения действий над элементами потока.
Пример использования Consumer с другими функциональными интерфейсами
Consumer можно комбинировать с другими функциональными интерфейсами, такими как Predicate, для создания более сложных сценариев.
#Java #Training #Medium #Functional_programming #Consumer #andThen
Метод andThen
Метод andThen позволяет комбинировать два Consumer таким образом, что сначала выполняется первый Consumer, а затем второй. Это полезно, когда нужно выполнить несколько действий над одним объектом.
Пример:
Consumer<String> printUpperCase = str -> System.out.println(str.toUpperCase());
Consumer<String> printLowerCase = str -> System.out.println(str.toLowerCase());
// Комбинируем два Consumer
Consumer<String> printBoth = printUpperCase.andThen(printLowerCase);
printBoth.accept("Hello"); // HELLO hello
В этом примере мы создали два Consumer: один выводит строку в верхнем регистре, а другой — в нижнем. Метод andThen объединяет их, и результат выполнения printBoth — это сначала вывод строки в верхнем регистре, а затем в нижнем.
Пример использования Consumer в Stream API
Consumer часто используется в Stream API для выполнения действий над элементами потока.
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class StreamConsumerExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// Создаем Consumer для вывода квадратов чисел
Consumer<Integer> printSquare = number -> System.out.println(number * number);
// Применяем Consumer к каждому элементу потока
numbers.stream().forEach(printSquare);
}
}
В этом примере мы используем Consumer для вывода квадратов чисел из списка. Метод forEach в Stream API принимает Consumer и применяет его к каждому элементу потока.
Пример использования Consumer с другими функциональными интерфейсами
Consumer можно комбинировать с другими функциональными интерфейсами, такими как Predicate, для создания более сложных сценариев.
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
public class CombinedExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eve");
// Создаем Predicate для фильтрации имен, начинающихся на "A"
Predicate<String> startsWithA = name -> name.startsWith("A");
// Создаем Consumer для вывода имен
Consumer<String> printName = name -> System.out.println(name);
// Фильтруем и выводим имена, начинающиеся на "A"
names.stream()
.filter(startsWithA)
.forEach(printName); // Alice
}
}
В этом примере мы используем Predicate для фильтрации имен, начинающихся на "A", и Consumer для вывода отфильтрованных имен.
#Java #Training #Medium #Functional_programming #Consumer #andThen
Интерфейс Supplier<T> и метод get
Supplier<T> — это функциональный интерфейс, представленный в Java 8 в пакете java.util.function. Он используется для предоставления (supply) объектов типа T без необходимости передавать какие-либо входные параметры. Интерфейс имеет один абстрактный метод get(), который возвращает объект типа T.
Как работает метод get?
Метод get — это основной метод интерфейса Supplier. Он не принимает никаких аргументов и возвращает объект типа T. Этот метод часто используется для ленивой инициализации или генерации данных.
Пример:
Плюсы и минусы использования Supplier
Плюсы:
Упрощает код, делая его более читаемым и выразительным.
Позволяет отложить создание объекта до момента, когда он действительно понадобится (ленивая инициализация).
Поддерживает лямбда-выражения, что делает код более компактным.
Минусы:
Может быть избыточным для простых случаев, где можно обойтись обычным созданием объекта.
Требует понимания функционального программирования для эффективного использования.
Пример использования Supplier для ленивой инициализации
Один из самых распространенных сценариев использования Supplier — это ленивая инициализация объектов, которые могут быть дорогостоящими для создания.
#Java #Training #Medium #Functional_programming #Supplier #get
Supplier<T> — это функциональный интерфейс, представленный в Java 8 в пакете java.util.function. Он используется для предоставления (supply) объектов типа T без необходимости передавать какие-либо входные параметры. Интерфейс имеет один абстрактный метод get(), который возвращает объект типа T.
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Как работает метод get?
Метод get — это основной метод интерфейса Supplier. Он не принимает никаких аргументов и возвращает объект типа T. Этот метод часто используется для ленивой инициализации или генерации данных.
Пример:
Supplier<String> helloSupplier = () -> "Hello, World!";
System.out.println(helloSupplier.get()); // Hello, World!
Здесь мы создали Supplier, который возвращает строку "Hello, World!". Метод get вызывается, и результат выводится на экран.
Плюсы и минусы использования Supplier
Плюсы:
Упрощает код, делая его более читаемым и выразительным.
Позволяет отложить создание объекта до момента, когда он действительно понадобится (ленивая инициализация).
Поддерживает лямбда-выражения, что делает код более компактным.
Минусы:
Может быть избыточным для простых случаев, где можно обойтись обычным созданием объекта.
Требует понимания функционального программирования для эффективного использования.
Пример использования Supplier для ленивой инициализации
Один из самых распространенных сценариев использования Supplier — это ленивая инициализация объектов, которые могут быть дорогостоящими для создания.
import java.util.function.Supplier;
public class LazyInitializationExample {
public static void main(String[] args) {
// Создаем Supplier для ленивой инициализации тяжелого объекта
Supplier<HeavyObject> heavyObjectSupplier = () -> {
System.out.println("Creating heavy object...");
return new HeavyObject();
};
// Объект не создается до вызова метода get
System.out.println("Heavy object not created yet");
// Создаем объект только когда он действительно нужен
HeavyObject heavyObject = heavyObjectSupplier.get();
heavyObject.doSomething();
}
}
class HeavyObject {
public HeavyObject() {
// Имитация тяжелой инициализации
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void doSomething() {
System.out.println("Heavy object is doing something...");
}
}
В этом примере мы используем Supplier для ленивой инициализации объекта HeavyObject. Объект создается только тогда, когда вызывается метод get.
#Java #Training #Medium #Functional_programming #Supplier #get
Что выведет код?
#Tasks
public class Task300125 {
public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println((a == b) + " " + (c == d));
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Что такое volatile в Java?
Что такое volatile в Java?
Anonymous Quiz
0%
Это ключевое слово для создания потоков.
21%
Это ключевое слово для синхронизации потоков.
79%
Это ключевое слово для обозначения переменной, которая может быть изменена несколькими потоками.
0%
Это ключевое слово для создания анонимных классов.
Более сложные сценарии использования Supplier
Supplier можно использовать для генерации данных, таких как случайные числа или уникальные идентификаторы.
Пример использования Supplier в Stream API
Supplier можно использовать в Stream API для создания бесконечных потоков данных.
Пример использования Supplier для создания объектов с параметрами
Supplier можно использовать для создания объектов с параметрами, передавая их через замыкание.
#Java #Training #Medium #Functional_programming #Supplier #get
Supplier можно использовать для генерации данных, таких как случайные числа или уникальные идентификаторы.
import java.util.Random;
import java.util.function.Supplier;
public class DataGenerationExample {
public static void main(String[] args) {
// Создаем Supplier для генерации случайных чисел
Supplier<Integer> randomNumberSupplier = () -> new Random().nextInt(100);
// Генерируем и выводим 5 случайных чисел
for (int i = 0; i < 5; i++) {
System.out.println(randomNumberSupplier.get());
}
}
}
В этом примере мы используем Supplier для генерации случайных чисел. Метод get вызывается в цикле, и каждое новое число выводится на экран.
Пример использования Supplier в Stream API
Supplier можно использовать в Stream API для создания бесконечных потоков данных.
import java.util.stream.Stream;
import java.util.function.Supplier;
public class InfiniteStreamExample {
public static void main(String[] args) {
// Создаем Supplier для генерации случайных чисел
Supplier<Double> randomDoubleSupplier = () -> Math.random();
// Создаем бесконечный поток случайных чисел
Stream<Double> infiniteStream = Stream.generate(randomDoubleSupplier);
// Ограничиваем поток 5 элементами и выводим их
infiniteStream.limit(5).forEach(System.out::println);
}
}
В этом примере мы используем Supplier для создания бесконечного потока случайных чисел. Метод Stream.generate принимает Supplier и создает поток, который генерирует элементы с помощью метода get. Мы ограничиваем поток 5 элементами и выводим их на экран.
Пример использования Supplier для создания объектов с параметрами
Supplier можно использовать для создания объектов с параметрами, передавая их через замыкание.
import java.util.function.Supplier;
public class ParameterizedObjectCreationExample {
public static void main(String[] args) {
String name = "Alice";
int age = 30;
// Создаем Supplier для создания объекта Person с параметрами
Supplier<Person> personSupplier = () -> new Person(name, age);
// Создаем объект Person
Person person = personSupplier.get();
System.out.println(person); // Person{name='Alice', age=30}
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
В этом примере мы используем Supplier для создания объекта Person с параметрами name и age. Параметры передаются через замыкание, и объект создается при вызове метода get.
#Java #Training #Medium #Functional_programming #Supplier #get