رابط های عملکردی پیش فرض در جاوا
Summarize this content to 400 words in Persian Lang به تازگی مطالعه رابط های عملکردی پیش فرض در جاوا را تمام کردم، فکر کردم همه آنها را به اشتراک بگذارم!
رابط های تابعی رابط هایی هستند که فقط یک روش انتزاعی دارند. اگر با عبارات لامبدا (برنامه نویسی کاربردی) سروکار دارید، آنها ضروری هستند. آنها کد را ساده می کنند و به طور گسترده در جریان ها استفاده می شوند. در حالی که میتوانید رابطهای کاربردی خود را ایجاد کنید، چرا وقتی جاوا موارد مهمی را در اختیار ما قرار میدهد نگران باشید Consumer، Predicate، Function، و Supplier?
1. مصرف کننده:
Consumer یک رابط کاربردی است که عملیاتی را نشان می دهد که یک آرگومان ورودی واحد را می پذیرد و هیچ نتیجه ای بر نمی گرداند. معمولاً برای انجام یک عمل بر روی آرگومان داده شده (مانند چاپ یا ورود به سیستم) بدون تغییر آن استفاده می شود.
امضا: void accept(T t) (که در آن T نوع عمومی است)
2. محمول:
Predicate یک رابط تابعی است که یک تابع آرگومان واحد را نشان می دهد که یک مقدار بولی را برمی گرداند. اغلب برای فیلتر کردن یا ارزیابی شرایط (مثلاً بررسی زوج بودن یک عدد) استفاده می شود.
امضا: boolean test(T t)
3. عملکرد:
Function یک رابط تابعی است که تابعی را نشان می دهد که یک آرگومان را می پذیرد و یک نتیجه را ایجاد می کند. معمولاً برای تبدیل (به عنوان مثال، تبدیل یک نوع به نوع دیگر یا تغییر داده ها) استفاده می شود.
امضا: R apply(T t)
4. تامین کننده:
Supplier یک رابط کاربردی است که تابعی را بدون آرگومان ورودی نشان می دهد و یک نتیجه را برمی گرداند. اغلب برای تولید یا ارائه مقادیر بدون نیاز به ورودی استفاده می شود.
امضا: T get()
ما می توانیم به طور موثر از رابط های کاربردی مانند Consumer، Predicate، Function و Supplier با تعریف روش های عمومی که این رابط ها را به عنوان پارامتر می پذیرند، استفاده کنیم. این به ما امکان می دهد از قدرت ژنریک ها استفاده کنیم و اطمینان حاصل کنیم که روش های ما می توانند با انواع مختلف کار کنند.
در اینجا نمونه ای از کد کامل است که عملکرد همه آنها را نشان می دهد
import java.util.List;
import java.util.Random;
import java.util.function.*;
public class Main {
public static void main(String[] args) {
// Consumer
usingConsumer((a) -> System.out.printf(“Hello %s”, a), “saami”);
System.out.println();
// Bi-Consumer
usingBiConsumer((a, b) -> System.out.printf(“Name: %s, Age: %d”, a, b), “saami”, 20);
System.out.println();
// Predicate
var result1 = usingPredicate((a) -> a % 2 == 0, 34);
if (result1) {
System.out.println(“Even”);
} else {
System.out.println(“Odd”);
}
// Bi-Predicate
var result2 = usingBiPredicate((a, b) -> a > b, 12, 22);
if (result2) {
System.out.println(“Greater”);
} else {
System.out.println(“Lesser”);
}
// Function
var result3 = usingFunction((a) -> a + “: this is a number”, 5);
System.out.println(result3);
// Bi-Function
var result4 = usingBiFunction((a, b) -> (a > b ? “Greater”: “Lesser”), 5, 6);
System.out.println(result4);
// Unary-Operator
var result5 = usingUnaryOperator((a) -> a+5, 10);
System.out.println(result5);
// Binary-Operator
var result6 = usingBinaryOperator((a, b) -> a + b, 12, 32);
System.out.println(result6);
Random r = new Random();
// Function as Predicate
var result7 = usingFunctionAsPredicate((a) -> a > 99, 999);
System.out.println(result7);
// Using Consumer for printing of the list.
printData((a) -> {
for (var ele : a) {
System.out.println(ele);
}
} , List.of(“S1”, “S2”, “S3”, “S4”, “S5”));
// Using Supplier as a random number generator
String[] arr = {“saami”, “john”, “raymond”, “puff”};
System.out.println(getRandomOne(arr, () -> new Random().nextInt(arr.length)));
// Using Custom Comparator
System.out.println(usingCustomFunctionalInterface((a, b, c) -> a + b + c, “Saami”, ” Abbas”, ” Khan”));
}
public static <T> void usingConsumer(Consumer<T> consumer, T a) {
// Method that takes consumer interface will return void.
// Can print something constituting ‘a’
consumer.accept(a);
}
public static <T, L> void usingBiConsumer(BiConsumer<T, L> biConsumer, T a, L b) {
biConsumer.accept(a, b);
}
public static <T> boolean usingPredicate(Predicate<T> predicate, T a) {
return predicate.test(a);
}
public static <T, L> boolean usingBiPredicate(BiPredicate<T, L> biPredicate, T a, L b) {
return biPredicate.test(a, b);
}
public static <T, R> R usingFunction(Function<T, R> function, T a) {
// T for the parameter and R for the return type here the return type could be as same as T or
// could be different like if T is Integer the R could be String 8 + “”
return function.apply(a);
}
public static <T, U, R> R usingBiFunction(BiFunction<T, U, R> biFunction, T a, U b) {
return biFunction.apply(a, b);
}
public static <T> T usingUnaryOperator(UnaryOperator<T> unaryOperator, T a) {
return unaryOperator.apply(a);
}
public static <T> T usingBinaryOperator(BinaryOperator<T> binaryOperator, T a, T b) {
return binaryOperator.apply(a, b);
}
public static <T, R> R usingFunctionAsPredicate(Function<T, R> prediFunction, T a) {
return prediFunction.apply(a);
}
public static <T> void printData(Consumer<T> consumer, T a) {
/*
* Prints the data, (List.of()) using a for loop inside of lambda function.
*/
consumer.accept(a);
}
public static String getRandomOne(String[] arr, Supplier<Integer> supplier) {
return arr[supplier.get()];
}
@FunctionalInterface
interface Concat<T> {
T concat(T a, T b, T c);
}
public static <T> T usingCustomFunctionalInterface(Concat<T> concat, T a, T b, T c) {
return concat.concat(a, b, c);
}
}
حکم نهایی
رابط های کاربردی در جاوا ابزاری قدرتمند برای ساده سازی کد و بهبود خوانایی هستند. چه در حال پردازش مجموعهها، انجام تبدیلها یا مدیریت جریان داده باشید، این رابطها تعریف عملیات مختصر را آسانتر میکنند.
با درک و به کارگیری رابط های کاربردی مانند Consumer، Predicate، Function، Supplierو موارد سفارشی، می توانید از ویژگی های برنامه نویسی کاربردی جاوا نهایت استفاده را ببرید.
به تازگی مطالعه رابط های عملکردی پیش فرض در جاوا را تمام کردم، فکر کردم همه آنها را به اشتراک بگذارم!
رابط های تابعی رابط هایی هستند که فقط یک روش انتزاعی دارند. اگر با عبارات لامبدا (برنامه نویسی کاربردی) سروکار دارید، آنها ضروری هستند. آنها کد را ساده می کنند و به طور گسترده در جریان ها استفاده می شوند. در حالی که میتوانید رابطهای کاربردی خود را ایجاد کنید، چرا وقتی جاوا موارد مهمی را در اختیار ما قرار میدهد نگران باشید Consumer
، Predicate
، Function
، و Supplier
?
1. مصرف کننده:
Consumer یک رابط کاربردی است که عملیاتی را نشان می دهد که یک آرگومان ورودی واحد را می پذیرد و هیچ نتیجه ای بر نمی گرداند. معمولاً برای انجام یک عمل بر روی آرگومان داده شده (مانند چاپ یا ورود به سیستم) بدون تغییر آن استفاده می شود.
امضا: void accept(T t)
(که در آن T نوع عمومی است)
2. محمول:
Predicate یک رابط تابعی است که یک تابع آرگومان واحد را نشان می دهد که یک مقدار بولی را برمی گرداند. اغلب برای فیلتر کردن یا ارزیابی شرایط (مثلاً بررسی زوج بودن یک عدد) استفاده می شود.
امضا: boolean test(T t)
3. عملکرد:
Function یک رابط تابعی است که تابعی را نشان می دهد که یک آرگومان را می پذیرد و یک نتیجه را ایجاد می کند. معمولاً برای تبدیل (به عنوان مثال، تبدیل یک نوع به نوع دیگر یا تغییر داده ها) استفاده می شود.
امضا: R apply(T t)
4. تامین کننده:
Supplier یک رابط کاربردی است که تابعی را بدون آرگومان ورودی نشان می دهد و یک نتیجه را برمی گرداند. اغلب برای تولید یا ارائه مقادیر بدون نیاز به ورودی استفاده می شود.
امضا: T get()
ما می توانیم به طور موثر از رابط های کاربردی مانند Consumer، Predicate، Function و Supplier با تعریف روش های عمومی که این رابط ها را به عنوان پارامتر می پذیرند، استفاده کنیم. این به ما امکان می دهد از قدرت ژنریک ها استفاده کنیم و اطمینان حاصل کنیم که روش های ما می توانند با انواع مختلف کار کنند.
در اینجا نمونه ای از کد کامل است که عملکرد همه آنها را نشان می دهد
import java.util.List;
import java.util.Random;
import java.util.function.*;
public class Main {
public static void main(String[] args) {
// Consumer
usingConsumer((a) -> System.out.printf("Hello %s", a), "saami");
System.out.println();
// Bi-Consumer
usingBiConsumer((a, b) -> System.out.printf("Name: %s, Age: %d", a, b), "saami", 20);
System.out.println();
// Predicate
var result1 = usingPredicate((a) -> a % 2 == 0, 34);
if (result1) {
System.out.println("Even");
} else {
System.out.println("Odd");
}
// Bi-Predicate
var result2 = usingBiPredicate((a, b) -> a > b, 12, 22);
if (result2) {
System.out.println("Greater");
} else {
System.out.println("Lesser");
}
// Function
var result3 = usingFunction((a) -> a + ": this is a number", 5);
System.out.println(result3);
// Bi-Function
var result4 = usingBiFunction((a, b) -> (a > b ? "Greater": "Lesser"), 5, 6);
System.out.println(result4);
// Unary-Operator
var result5 = usingUnaryOperator((a) -> a+5, 10);
System.out.println(result5);
// Binary-Operator
var result6 = usingBinaryOperator((a, b) -> a + b, 12, 32);
System.out.println(result6);
Random r = new Random();
// Function as Predicate
var result7 = usingFunctionAsPredicate((a) -> a > 99, 999);
System.out.println(result7);
// Using Consumer for printing of the list.
printData((a) -> {
for (var ele : a) {
System.out.println(ele);
}
} , List.of("S1", "S2", "S3", "S4", "S5"));
// Using Supplier as a random number generator
String[] arr = {"saami", "john", "raymond", "puff"};
System.out.println(getRandomOne(arr, () -> new Random().nextInt(arr.length)));
// Using Custom Comparator
System.out.println(usingCustomFunctionalInterface((a, b, c) -> a + b + c, "Saami", " Abbas", " Khan"));
}
public static <T> void usingConsumer(Consumer<T> consumer, T a) {
// Method that takes consumer interface will return void.
// Can print something constituting 'a'
consumer.accept(a);
}
public static <T, L> void usingBiConsumer(BiConsumer<T, L> biConsumer, T a, L b) {
biConsumer.accept(a, b);
}
public static <T> boolean usingPredicate(Predicate<T> predicate, T a) {
return predicate.test(a);
}
public static <T, L> boolean usingBiPredicate(BiPredicate<T, L> biPredicate, T a, L b) {
return biPredicate.test(a, b);
}
public static <T, R> R usingFunction(Function<T, R> function, T a) {
// T for the parameter and R for the return type here the return type could be as same as T or
// could be different like if T is Integer the R could be String 8 + ""
return function.apply(a);
}
public static <T, U, R> R usingBiFunction(BiFunction<T, U, R> biFunction, T a, U b) {
return biFunction.apply(a, b);
}
public static <T> T usingUnaryOperator(UnaryOperator<T> unaryOperator, T a) {
return unaryOperator.apply(a);
}
public static <T> T usingBinaryOperator(BinaryOperator<T> binaryOperator, T a, T b) {
return binaryOperator.apply(a, b);
}
public static <T, R> R usingFunctionAsPredicate(Function<T, R> prediFunction, T a) {
return prediFunction.apply(a);
}
public static <T> void printData(Consumer<T> consumer, T a) {
/*
* Prints the data, (List.of()) using a for loop inside of lambda function.
*/
consumer.accept(a);
}
public static String getRandomOne(String[] arr, Supplier<Integer> supplier) {
return arr[supplier.get()];
}
@FunctionalInterface
interface Concat<T> {
T concat(T a, T b, T c);
}
public static <T> T usingCustomFunctionalInterface(Concat<T> concat, T a, T b, T c) {
return concat.concat(a, b, c);
}
}
حکم نهایی
رابط های کاربردی در جاوا ابزاری قدرتمند برای ساده سازی کد و بهبود خوانایی هستند. چه در حال پردازش مجموعهها، انجام تبدیلها یا مدیریت جریان داده باشید، این رابطها تعریف عملیات مختصر را آسانتر میکنند.
با درک و به کارگیری رابط های کاربردی مانند Consumer
، Predicate
، Function
، Supplier
و موارد سفارشی، می توانید از ویژگی های برنامه نویسی کاربردی جاوا نهایت استفاده را ببرید.