Nima uchun kerak?
Funksional dasturlash tillaridan OOPga yoʻnaltirilgan tilga oʻtgan vaqtlarimda function va method bitta tushunchami degan savolga duch kelganman. Va ular oʻxshash boʻlsada bir-biridan farqli jihatlarini topganman.
Function bu hech qanday class yoki obyektga bogʻliq boʻlmagan holda mustaqil mavjud boʻla oladigan funksionallik. Method esa aksincha, ular albatta biror obyekt yoki classga tegishli boʻlishi kerak.
Java 8 da qoʻshilgan foydali xususiyatlardan biri bu — Functional Interface hisoblanadi.
Functional Interface’ning asosiy maqsadi — Java-ga Funksional dasturlash unsurlarini olib kirish va Lyambda (->) ifodalarini ishlatish uchun asos boʻlib xizmat qiladi.
Functional Interface yordamida yuqoridagi aytganimdek methodlarni xuddi mustaqil functionlardek ishlata olish, methodning oʻzini oʻzgaruvchi kabi metodlarga argument sifatida uzatish imkonini beradi.
Qanday foydalanamiz?
Functional interface yaratish uchun faqat bitta abstract methodga ega boʻlgan interface yaratish shart. Koʻp ham, oz ham emas.
@FunctionalInterface annotatsiyasini qoʻyish majburiy emas, lekin u qoʻyilsa, kompilyator interfeysda ikkinchi abstrakt metod qoʻshilib ketmasligini va qoidaga amal qilinganini tekshirib turadi.
@FunctionalInterface
public interface MathOperation {
double calculate(double a, double b);
}MathOperation.java
public class Main1 {
public static void main(String[] args) {
MathOperation addition = (a, b) -> a + b;
MathOperation subtraction = (a, b) -> a - b;
MathOperation multiplication = (a, b) -> a * b;
MathOperation division = (a, b) -> b != 0 ? a / b : 0;
System.out.println("Qoʻshish: " + addition.calculate(20, 10));
System.out.println("Ayrish: " + subtraction.calculate(20, 10));
System.out.println("Koʻpaytirish: " + multiplication.calculate(20, 10));
System.out.println("Boʻlish: " + division.calculate(20, 10));
Runnable task = () -> System.out.println("Task1");
}
}Main1.java
Chiqish:
Qoʻshish: 30.0
Ayrish: 10.0
Koʻpaytirish: 200.0
Boʻlish: 2.0
Java 8 dan boshlab qator classlarda functional interface ishlatish mumkin.
public class Main2 {
public static void main(String[] args) {
Runnable task = () -> System.out.println("Task1");
}
}Main2.java
Aynan Runnable interface’ning oʻzi ham functional interface hisoblanadi:
package java.lang;
@FunctionalInterface
public interface Runnable {
/**
* Runs this operation.
*/
void run();
}Runnable.java
java.util.function paketida 40 dan ortiq tayyor functional interfacelar mavjud.
Ulardan eng koʻp ishlatiladiganlari:
| Interfeys | Abstrakt Metod | Vazifasi | Misol (Lambda) |
|---|---|---|---|
| Predicate | boolean test(T t) | Shartni tekshiradi (true/false qaytaradi). | str -> str.isEmpty() |
| Consumer | void accept(T t) | Qiymatni qabul qiladi, hech narsa qaytarmaydi. | val -> System.out.println(val) |
| Supplier | T get() | Argument olmaydi, lekin qiymat qaytaradi. | () -> Math.random() |
| Function<T, R> | R apply(T t) | T tipidagi qiymatni qabul qilib, R tipiga oʻzgartirib qaytaradi. | str -> str.length() |