Java for Beginner
673 subscribers
541 photos
155 videos
12 files
827 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Интерфейс Consumer<T> и метод 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
Что выведет код?

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
Варианты ответа:
Anonymous Quiz
24%
apple
42%
banana
5%
cherry
29%
null
Ты же программист, помоги 😁

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Более сложные сценарии использования Consumer

Метод 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
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Интерфейс Supplier<T> и метод 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
Что выведет код?

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
Варианты ответа:
Anonymous Quiz
42%
true true
42%
true false
0%
false true
16%
false false
И не говори что не делал так 😊😂

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Более сложные сценарии использования Supplier

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
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Интерфейс Function<T, R> и метод apply

Function<T, R> — это функциональный интерфейс, представленный в Java 8 в пакете java.util.function. Он используется для преобразования объекта типа T в объект типа R. Интерфейс имеет один абстрактный метод apply(T t), который принимает объект типа T и возвращает объект типа R.

@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}


Как работает метод apply?

Метод apply — это основной метод интерфейса Function. Он принимает объект типа T и возвращает объект типа R. Этот метод часто используется для преобразования данных.

Пример:
Function<String, Integer> stringLength = str -> str.length();
System.out.println(stringLength.apply("Hello")); // 5
Здесь мы создали Function, который принимает строку и возвращает ее длину. Метод apply применяется к строке "Hello", и результат выводится на экран.


Плюсы и минусы использования Function

Плюсы:
Упрощает код, делая его более читаемым и выразительным.
Позволяет легко преобразовывать данные, особенно в сочетании с Stream API.
Поддерживает лямбда-выражения, что делает код более компактным.


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


Пример использования Function для преобразования данных

Один из самых распространенных сценариев использования Function — это преобразование данных в Stream API.

import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

public class FunctionExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eve");

// Создаем Function для преобразования строк в их длины
Function<String, Integer> nameLength = str -> str.length();

// Преобразуем список имен в список их длин
List<Integer> lengths = names.stream()
.map(nameLength)
.collect(Collectors.toList());

System.out.println(lengths); // [5, 3, 7, 5, 3]
}
}
В этом примере мы используем Function для преобразования списка имен в список их длин. Метод map в Stream API принимает Function и применяет его к каждому элементу потока.


#Java #Training #Medium #Functional_programming #Function #apply
Что выведет код?

public class Task310125 {
public static void main(String[] args) {
List<String> list = List.of("apple", "banana", "cherry");
list.set(1, "orange");
System.out.println(list);
}
}


#Tasks