মেথড কল আর্গুমেন্ট হিসেবে পাস করা কী?
জাভাতে একটি মেথডের রিটার্ন ভ্যালুকে সরাসরি অন্য একটি মেথডের আর্গুমেন্ট হিসেবে পাস করা যায়। এটি কোডকে সংক্ষিপ্ত এবং পাঠযোগ্য করে তোলে। তবে জাভায় ফাংশনকে ফাস্ট-ক্লাস সিটিজেন (first-class citizen) হিসেবে পাস করা যায় না (C/C++ ফাংশন পয়েন্টার বা ফাংশনাল প্রোগ্রামিং ল্যাংগুয়েজের মতো)।
ইনপুট ও আউটপুট উদাহরণ
ইনপুট:
Enter two numbers : 2 and 3
আউটপুট:
The cube of the sum of two numbers is: 125
(2+3)³ = 5³ = 125
অ্যালগরিদম
- প্রোগ্রাম শুরু করুন
- দুটি ইন্টিজার ভেরিয়েবল ঘোষণা করুন: my_input_1, my_input_2
- my_sum(a, b) ফাংশন ডিফাইন করুন যা যোগফল রিটার্ন করে
- my_cube(n) ফাংশন ডিফাইন করুন যা ঘন বের করে প্রিন্ট করে
- মেইন মেথডে অবজেক্ট তৈরি করুন এবং Scanner দিয়ে ইনপুট নিন
- obj.my_cube(obj.my_sum(my_input_1, my_input_2)) কল করুন
- ফলাফল প্রদর্শন করুন
- প্রোগ্রাম শেষ করুন
উদাহরণ ১: ব্যবহারকারী ইনপুট নেওয়া
import java.util.Scanner;
public class Main {
public int my_sum(int a, int b) {
int sum = a + b;
return sum;
}
public void my_cube(int my_input) {
int my_result = my_input * my_input * my_input;
System.out.println(my_result);
}
public static void main(String[] args) {
Main obj = new Main();
int my_input_1, my_input_2;
System.out.println("Required packages have been imported");
Scanner my_scanner = new Scanner(System.in);
System.out.println("A reader object has been defined");
System.out.print("Enter the first number : ");
my_input_1 = my_scanner.nextInt();
System.out.print("Enter the second number : ");
my_input_2 = my_scanner.nextInt();
System.out.println("The cube of the sum of two numbers is: ");
obj.my_cube(obj.my_sum(my_input_1, my_input_2));
}
}
উদাহরণ ২: পূর্বনির্ধারিত মান ব্যবহার
public class Main {
public int my_sum(int a, int b) {
int sum = a + b;
return sum;
}
public void my_cube(int my_input) {
int my_result = my_input * my_input * my_input;
System.out.println(my_result);
}
public static void main(String[] args) {
Main obj = new Main();
int my_input_1 = 3;
int my_input_2 = 2;
System.out.println("The two number is defined as " + my_input_1 + " and " + my_input_2);
System.out.println("The cube of the sum of two numbers is: ");
obj.my_cube(obj.my_sum(my_input_1, my_input_2));
}
}
কোড ব্যাখ্যা
- obj.my_sum(...): প্রথমে এটি এক্সিকিউট হয় এবং যোগফল রিটার্ন করে
- obj.my_cube(...): রিটার্ন হওয়া যোগফল আর্গুমেন্ট হিসেবে পায় এবং ঘন বের করে
- নেস্টেড কল: বাহেরের মেথডে ইনার মেথডের রিটার্ন ভ্যালু পাস করা
ফাংশনাল ইন্টারফেস ও ল্যাম্বডা (Java 8+) - আসল "ফাংশন পাস করা"
জাভা ৮ থেকে ফাংশনাল ইন্টারফেস এবং ল্যাম্বডা এক্সপ্রেশন দিয়ে আসল মানে ফাংশন পাস করা যায়:
import java.util.function.Function;
public class FunctionalExample {
// ফাংশন আর্গুমেন্ট হিসেবে নেওয়া
public static void process(Function func, int value) {
int result = func.apply(value);
System.out.println("Result: " + result);
}
public static void main(String[] args) {
// ল্যাম্বডা দিয়ে ফাংশন পাস
process(x -> x * x, 5); // 25
process(x -> x * x * x, 3); // 27
process(x -> x + 10, 7); // 17
// মেথড রেফারেন্স
FunctionalExample::cube;
process(FunctionalExample::cube, 4); // 64
}
static int cube(int x) { return x * x * x; }
}
হাইয়ার-অর্ডার ফাংশন (Higher-Order Functions)
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class HigherOrder {
public static void main(String[] args) {
List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// ফিল্টার করার কন্ডিশন পাস করা
printFiltered(numbers, n -> n % 2 == 0); // জোড়
printFiltered(numbers, n -> n > 5); // ৫-এর বেশি
printFiltered(numbers, n -> n % 3 == 0); // ৩ দিয়ে বিভাজ্য
}
static void printFiltered(List list, Predicate condition) {
list.stream()
.filter(condition)
.forEach(System.out::println);
}
}
কম্পোজিশন (Function Composition)
Function addOne = x -> x + 1;
Function square = x -> x * x;
// কম্পোজ: square(addOne(x))
Function composed = addOne.andThen(square);
System.out.println(composed.apply(3)); // (3+1)² = 16
// কম্পোজ: addOne(square(x))
Function composed2 = square.andThen(addOne);
System.out.println(composed2.apply(3)); // 3²+1 = 10
সতর্কতা
- জাভায় প্রাইমিটিভ টাইপ (int, double) ফাংশনাল ইন্টারফেসে ফিট হয় না - বক্সিং/আনবক্সিং হয়
- IntFunction, ToIntFunction, DoubleFunction ব্যবহার করুন প্রাইমিটিভের জন্য
- রিকার্সিভ ল্যাম্বডা লিখতে হলে ইন্টারফেস টাইপ ডিক্লেয়ার করতে হয়