Optional Class

জাভা ফাংশনাল প্রোগ্রামিং (Java Functional Programming) - Java Technologies

365

Optional ক্লাসটি Java 8 এ পরিচিত হয় এবং এটি null safety প্রদান করতে ব্যবহৃত হয়। Optional একটি container object যা একটি non-null value ধারণ করতে পারে অথবা null ধারণ করতে পারে। মূলত, Optional ব্যবহার করার উদ্দেশ্য হল কোডে null pointer exceptions প্রতিরোধ করা, যা অনেক সময় Java প্রোগ্রামিংয়ে একটি বড় সমস্যা হতে পারে।

1. Optional Class এর Purpose:

  • Null Safety: Optional ব্যবহার করার মাধ্যমে আপনি null এর সম্ভাবনা (null references) কমাতে পারবেন, যা NullPointerExceptions (NPE) থেকে রক্ষা করবে।
  • Functional Programming: Java 8 থেকে Lambda Expressions এবং Streams API এর সাথে Optional এর ব্যবহার কোডকে আরও কার্যকরী এবং পারসনালাইজড করে তোলে।
  • Clearer Code: Optional ব্যবহার করে আপনি null চেক করার জন্য প্যারামিটার গুলোকে পরিষ্কার এবং যথাযথভাবে পরিচালনা করতে পারবেন।

Optional মূলত Functional Programming প্যাটার্নে null মানের অস্তিত্ব চেক করার একটি পরিষ্কার এবং শক্তিশালী উপায় সরবরাহ করে।


2. Optional Class এর মূল ফিচার:

  • Empty Optional: একটি Optional অবজেক্ট যা কোনো ভ্যালু ধারণ করে না।
  • Non-empty Optional: একটি Optional অবজেক্ট যা একটি মান ধারণ করে (যেমন, non-null মান)।
  • Optional creation: Optional তৈরি করার জন্য Optional.of(), Optional.empty(), এবং Optional.ofNullable() মেথডগুলি ব্যবহার করা হয়।

3. Optional Class এর Syntax:

Optional<T> optionalValue = Optional.of(value);         // Non-null value
Optional<T> emptyOptional = Optional.empty();            // Empty Optional
Optional<T> nullableOptional = Optional.ofNullable(value); // Nullable value (may be null)
  • Optional.of(value) ব্যবহার করা হয় যখন আপনি নিশ্চিত হন যে মানটি null হবে না।
  • Optional.empty() একটি খালি Optional তৈরি করে।
  • Optional.ofNullable(value) ব্যবহার করা হয় যখন মানটি হতে পারে null অথবা non-null।

4. Optional Class এর উদাহরণ:

4.1 Optional.of() ব্যবহার:

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        // Creating Optional with a non-null value
        Optional<String> name = Optional.of("John");
        name.ifPresent(System.out::println);  // John
    }
}

ব্যাখ্যা:

  • এখানে Optional.of("John") একটি non-null value ধারণ করছে এবং ifPresent() মেথডের মাধ্যমে মানটি প্রিন্ট করা হয়েছে।

4.2 Optional.empty() ব্যবহার:

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        // Creating an empty Optional
        Optional<String> emptyName = Optional.empty();
        System.out.println(emptyName.isPresent());  // false
    }
}

ব্যাখ্যা:

  • Optional.empty() একটি খালি Optional তৈরি করে, এবং isPresent() চেক করে যে এটি কোনো মান ধারণ করছে কি না।

4.3 Optional.ofNullable() ব্যবহার:

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        String name = null;
        
        // Creating Optional with a nullable value
        Optional<String> nullableName = Optional.ofNullable(name);
        
        // Checking if the value is present
        System.out.println(nullableName.isPresent());  // false
        nullableName.ifPresent(System.out::println);  // No output, since the value is null
    }
}

ব্যাখ্যা:

  • Optional.ofNullable(name) ব্যবহার করে, আপনি একটি Optional তৈরি করতে পারেন যা null বা non-null ভ্যালু ধারণ করতে পারে।
  • ifPresent() মেথড শুধুমাত্র মানটি যদি উপস্থিত থাকে তবেই কিছু কার্যক্রম সম্পাদন করবে।

5. Common Methods in Optional Class:

5.1 isPresent():

isPresent() মেথডটি চেক করে যে Optional অবজেক্টটি একটি non-null মান ধারণ করছে কি না।

Optional<String> name = Optional.of("John");
System.out.println(name.isPresent());  // true

5.2 ifPresent():

ifPresent() মেথডটি ব্যবহার করা হয় যখন একটি মান উপস্থিত থাকলে কিছু কার্যক্রম সম্পাদন করতে।

Optional<String> name = Optional.of("John");
name.ifPresent(n -> System.out.println("Hello, " + n));  // Output: Hello, John

5.3 orElse():

orElse() মেথডটি ব্যবহার করা হয় যখন Optional খালি থাকে (null), তখন একটি ডিফল্ট মান প্রদান করতে।

Optional<String> name = Optional.ofNullable(null);
String result = name.orElse("Default Name");
System.out.println(result);  // Output: Default Name

5.4 orElseGet():

orElseGet() মেথডটি orElse() এর মতো, তবে এখানে আপনি একটি ল্যাম্বডা বা ফাংশন পাস করতে পারেন, যা ডিফল্ট মান প্রদান করবে যদি Optional খালি হয়।

Optional<String> name = Optional.ofNullable(null);
String result = name.orElseGet(() -> "Default Name");
System.out.println(result);  // Output: Default Name

5.5 map():

map() মেথডটি Optional এর মধ্যে একটি মান উপস্থিত থাকলে একটি ফাংশন প্রয়োগ করে এবং নতুন Optional রিটার্ন করে।

Optional<String> name = Optional.of("John");
Optional<String> upperName = name.map(String::toUpperCase);
upperName.ifPresent(System.out::println);  // Output: JOHN

5.6 flatMap():

flatMap() মেথডটি map() এর মতো, তবে এটি একটি nested Optional থেকে মুক্তি পেতে সাহায্য করে। এর মাধ্যমে একটি Optional এর ভেতরে থাকা Optional রিটার্ন করা যায়।

Optional<String> name = Optional.of("John");
Optional<String> result = name.flatMap(n -> Optional.of(n.toUpperCase()));
result.ifPresent(System.out::println);  // Output: JOHN

6. Advantages of Using Optional:

  1. Avoiding NullPointerException: Optional null মানকে সঠিকভাবে পরিচালনা করতে সহায়তা করে, যা NullPointerException থেকে রক্ষা করে।
  2. Cleaner Code: Optional ব্যবহার করে কোড অনেক বেশি পরিষ্কার এবং সহজ পাঠযোগ্য হয়, বিশেষ করে যখন null চেক করতে হয়।
  3. Functional Style Programming: Optional Java 8 থেকে শুরু হওয়া Functional Programming এর অংশ, যা ফাংশনাল ইন্টারফেসের সাথে খুব ভালোভাবে কাজ করে।
  4. Avoids Null Checks: Optional দিয়ে আপনি explicit null checks এড়াতে পারেন এবং কোডের ভুল বোঝাবুঝি কমাতে পারেন।

7. When to Use Optional:

  • Method Return Type: যখন কোনো মেথড এমন মান রিটার্ন করতে পারে যা হতে পারে null, তখন Optional ব্যবহার করা উচিত।
  • Avoiding Null Checks: যখন আপনি কিছু মানের জন্য null চেক করতে চান না, তখন Optional ব্যবহার করতে পারেন।
  • Functional Programming: Optional মূলত Functional Programming ধারণার অংশ এবং ল্যাম্বডা এবং স্ট্রিম অপারেশনগুলির সাথে সংযুক্ত করার জন্য উপযুক্ত।

সারাংশ:

Optional ক্লাসটি Java 8 এর একটি গুরুত্বপূর্ণ ফিচার যা null এর সমস্যা সমাধানে সাহায্য করে এবং কোডে null pointer exceptions প্রতিরোধ করে। এটি কোডের রিডেবিলিটি বাড়ায় এবং functional programming প্যাটার্নে কাজ করার জন্য একটি শক্তিশালী টুল। Optional বিভিন্ন মেথড যেমন map(), flatMap(), orElse(), এবং ifPresent() এর মাধ্যমে কার্যকরভাবে null handling এবং transformations পরিচালনা করতে সহায়তা করে।

Content added By

Optional এর ধারণা এবং প্রয়োজনীয়তা

360

Java Functional ProgrammingOptional একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা null safety নিশ্চিত করতে এবং কোডে null চেকিং সহজ করার জন্য ব্যবহৃত হয়। Optional জাভা 8 তে java.util প্যাকেজে অন্তর্ভুক্ত করা হয়েছে এবং এটি একটি ফাংশনাল পারাডাইমের অংশ হিসেবে কাজ করে, যেখানে অপশনাল মান (optional value) লজিক্যালভাবে পরিচালিত হয়।

Optional এক ধরনের container object যা null অথবা non-null মান ধারণ করতে পারে। এটি ফাংশনাল প্রোগ্রামিং এর সাথে কাজ করে, যেখানে null ভ্যালু থেকে সৃষ্ট সমস্যা (যেমন NullPointerException) কমানো এবং কোডের রিডেবিলিটি ও সেফটি বৃদ্ধি করা হয়।


১. Optional কি?

Optional একটি container object যা কোনো মান ধারণ করতে পারে অথবা এটি খালি (empty) থাকতে পারে, অর্থাৎ এটি null থাকতে পারে। এর মূল উদ্দেশ্য হলো null চেক করার প্রয়োজনীয়তা কমানো এবং কোডের মধ্যে null সম্পর্কিত ব্যতিক্রম (exceptions) কমানো।

Optional এর মূল সুবিধা হলো এটি আপনাকে একটি ভ্যালু ফেরত দেওয়ার পরিবর্তে একটি container প্রদান করে, যা আপনি ফাংশনাল স্টাইলে ব্যবহার করতে পারেন।

২. Optional এর Sintax

Optional ব্যবহার করতে, আপনি সাধারণত Optional.of(), Optional.empty(), বা Optional.ofNullable() মেথডগুলো ব্যবহার করেন।

Optional<Type> optionalValue = Optional.of(value);
Optional<Type> emptyValue = Optional.empty();
Optional<Type> nullableValue = Optional.ofNullable(value);

এখানে:

  • Optional.of(T value) একটি Optional তৈরি করে যা একটি non-null মান ধারণ করে।
  • Optional.empty() একটি খালি Optional (যার মধ্যে কোনো মান নেই) তৈরি করে।
  • Optional.ofNullable(T value) একটি Optional তৈরি করে যা একটি nullable মান ধারণ করে, অর্থাৎ, এটি null অথবা non-null হতে পারে।

৩. Optional এর মূল কার্যাবলী

Optional অনেক ধরনের মেথড সরবরাহ করে যেগুলোর মাধ্যমে আপনি null মানের সমস্যা এড়িয়ে কার্যকরীভাবে কাজ করতে পারেন।

৩.১ isPresent() এবং ifPresent()

  • isPresent(): এটি যাচাই করে যে Optional অবজেক্টে কোনো মান আছে কি না।
  • ifPresent(): এটি একটি consumer ফাংশন গ্রহণ করে, যা শুধুমাত্র তখন কার্যকর হবে যখন Optional অবজেক্টে একটি মান উপস্থিত থাকবে।

উদাহরণ:

Optional<String> name = Optional.of("John");

// Checking if value is present
if (name.isPresent()) {
    System.out.println("Name: " + name.get());
}

// Using ifPresent to execute a function if a value is present
name.ifPresent(n -> System.out.println("Name: " + n));

৩.২ get()

get() মেথডটি Optional অবজেক্ট থেকে মান বের করে, তবে এটি যদি খালি থাকে (অর্থাৎ, null থাকে), তবে এটি একটি NoSuchElementException ছুঁড়ে ফেলে।

Optional<String> name = Optional.of("John");
System.out.println(name.get());  // Output: John

৩.৩ orElse() এবং orElseGet()

  • orElse(T other): এটি একটি ডিফল্ট মান প্রদান করে যদি Optional খালি থাকে।
  • orElseGet(Supplier<? extends T> other): এটি একটি supplier ফাংশন গ্রহণ করে যা ডিফল্ট মান প্রদান করবে।

উদাহরণ:

Optional<String> name = Optional.empty();

// If name is not present, use default value
String defaultName = name.orElse("Default Name");
System.out.println(defaultName);  // Output: Default Name

// Using orElseGet with a Supplier
String defaultNameWithSupplier = name.orElseGet(() -> "Supplier Default Name");
System.out.println(defaultNameWithSupplier);  // Output: Supplier Default Name

৩.৪ map() এবং flatMap()

  • map(): এটি Optional এর মধ্যে থাকা মানের উপর একটি ফাংশন প্রয়োগ করে এবং একটি নতুন Optional ফেরত দেয়।
  • flatMap(): এটি map() এর মতো, তবে এটি একটি ফ্ল্যাট Optional ফেরত দেয় (যদি ফাংশনটি আরেকটি Optional ফেরত দেয়)।

উদাহরণ:

Optional<String> name = Optional.of("John");

// Using map to transform the value inside Optional
Optional<String> upperName = name.map(n -> n.toUpperCase());
System.out.println(upperName.get());  // Output: JOHN

// Using flatMap
Optional<Optional<String>> nestedName = Optional.of(Optional.of("Jane"));
Optional<String> flatName = nestedName.flatMap(n -> n);
System.out.println(flatName.get());  // Output: Jane

৩.৫ filter()

filter() মেথডটি Optional অবজেক্টের মানের উপর একটি শর্ত প্রয়োগ করে এবং একটি নতুন Optional ফেরত দেয় যদি শর্তটি পূর্ণ হয়।

উদাহরণ:

Optional<String> name = Optional.of("John");

// Filtering based on condition
Optional<String> filteredName = name.filter(n -> n.startsWith("J"));
System.out.println(filteredName.get());  // Output: John

Optional<String> emptyName = name.filter(n -> n.startsWith("X"));
System.out.println(emptyName.isPresent());  // Output: false

৪. Optional এর প্রয়োজনীয়তা

৪.১ Null Pointer Exception (NPE) রোধ

একটি বড় সমস্যা যা জাভা প্রোগ্রামিং এ ঘটতে পারে তা হল NullPointerException (NPE)। Optional ব্যবহার করলে null এর পরিবর্তে একটি সুস্পষ্ট উপায় তৈরি হয়, যা এক্সপ্রেসিভ এবং নিরাপদ থাকে।

উদাহরণ:

String name = null;
System.out.println(name.length());  // Throws NullPointerException

এই সমস্যা সমাধানে Optional ব্যবহার করা হয়:

Optional<String> name = Optional.ofNullable(null);
name.ifPresent(n -> System.out.println(n.length()));  // Does not throw exception

৪.২ Functional Style of Programming

Optional ফাংশনাল প্রোগ্রামিং এ সহায়তা করে, যেখানে আপনি লম্বা null চেকিং কোডের বদলে stream-based পদ্ধতিতে কাজ করতে পারেন। Optional আপনার কোডকে map, flatMap, filter ইত্যাদি ফাংশনাল অপারেশন করতে সহায়ক করে।

৪.৩ Readable and Clean Code

Optional ব্যবহার করলে কোড আরও পরিষ্কার এবং রিডেবল হয়, কারণ এতে null এর জন্য বিশেষভাবে কিছু নির্দিষ্ট চেক করা হয়, যা সাধারণত কোডে দেখা যায় না।


৫. Optional এর কিছু সাধারন ব্যবহার

  1. Return Type হিসেবে Optional:

    • যখন একটি ফাংশন এমন কোনো ভ্যালু রিটার্ন করে যা null হতে পারে, তখন Optional ফেরত দেয়ার মাধ্যমে null এর সমস্যা থেকে মুক্তি পাওয়া যায়।
    public Optional<String> findNameById(int id) {
        if (id == 1) {
            return Optional.of("John");
        } else {
            return Optional.empty();
        }
    }
    
  2. Functional Chaining:

    • Optional ব্যবহার করে আপনি ফাংশনাল চেইনিং করতে পারেন, যেমন map/filter এবং পরে orElse() ব্যবহার করতে পারেন।
    Optional<String> name = Optional.of("Java");
    String result = name.filter(n -> n.length() > 3)
                        .map(String::toUpperCase)
                        .orElse("Default");
    System.out.println(result);  // Output: JAVA
    

সারাংশ

Optional হল একটি শক্তিশালী ধারণা যা ফাংশনাল প্রোগ্রামিং স্টাইলে Java কোড লিখতে সহায়তা করে। এটি null চেকিং সহজ করে এবং কোডে null সম্পর্কিত সমস্যা (যেমন NullPointerException) রোধ করতে সহায়তা করে। Optional ফাংশনাল প্রোগ্রামিং ধারণার একটি অপরিহার্য অংশ, যা map, filter, flatMap, ifPresent, orElse ইত্যাদি ফাংশনাল অপারেশন সমর্থন করে। এটি কোডকে আরও রিডেবল, সেফ এবং স্কেলেবল করে তোলে।

Content added By

NullPointerException প্রতিরোধে Optional এর ব্যবহার

355

NullPointerException (NPE) হল একটি খুব সাধারণ এবং frustrating exception যা null ভ্যালু অ্যাক্সেস করার চেষ্টা করার সময় ঘটে। Java 8Optional নামক একটি ক্লাস চালু করা হয়েছে যা null ভ্যালুর জন্য নিরাপদ অপারেশন করতে সহায়তা করে। এটি ফাংশনাল প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য এবং NPE প্রতিরোধে একটি কার্যকরী উপায়।

Optional ক্লাসটি মূলত একটি container (যতটুকু আপনি একটি মান ধারণ করতে পারেন) হিসেবে কাজ করে, যা null ভ্যালু ধারণ করতে পারে এবং এই Optional ভ্যালুর সাথে নিরাপদে কাজ করার জন্য বিভিন্ন মেথড সরবরাহ করে।

এই গাইডে, NullPointerException থেকে বাঁচতে Optional এর ব্যবহার এবং এর মূল বৈশিষ্ট্যগুলো তুলে ধরা হয়েছে।


1. Optional কী?

Optional একটি container object যা null হতে পারে এমন যে কোনো মানকে ধারণ করতে পারে, এবং সেই মানটি ব্যবহার করা নিরাপদ করতে সাহায্য করে। এটি মূলত ৩টি ধরনের হতে পারে:

  1. Optional.empty(): এটি একটি empty Optional তৈরি করে, অর্থাৎ এখানে কোনো মান নেই।
  2. Optional.of(T value): এটি একটি non-null value ধারণ করে এমন একটি Optional তৈরি করে।
  3. Optional.ofNullable(T value): এটি একটি Optional তৈরি করে যা null বা non-null উভয় ধরনের মান ধারণ করতে পারে।

2. Optional এর মাধ্যমে NullPointerException প্রতিরোধ

NullPointerException প্রতিরোধে Optional ব্যবহারের মূল উদ্দেশ্য হলো null ভ্যালুর জন্য নিরাপদ অপারেশন প্রদান করা, যাতে null মান পাওয়ার পরে NullPointerException ঘটতে না পারে।

Optional এর সাথে Null Checking:

import java.util.Optional;

public class OptionalExample {

    public static void main(String[] args) {
        String name = null;
        
        // Create an Optional object which can hold a null or non-null value
        Optional<String> optionalName = Optional.ofNullable(name);
        
        // Using isPresent() to check if the value is present
        if (optionalName.isPresent()) {
            System.out.println("Name is: " + optionalName.get());
        } else {
            System.out.println("Name is not available.");
        }
    }
}

Explanation:

  • Optional.ofNullable() ব্যবহার করে একটি Optional তৈরি করা হয়েছে, যা null বা non-null মান ধারণ করতে পারে।
  • isPresent() মেথডের মাধ্যমে চেক করা হয় যে, Optional এর মধ্যে কোন মান আছে কিনা।
  • get() মেথডটি শুধুমাত্র যখন মান উপস্থিত থাকে তখনই ব্যবহৃত হয়।

Output:

Name is not available.

3. Optional এর কিছু গুরুত্বপূর্ণ মেথড

Optional ক্লাসটি null এবং Optional ভ্যালুর সাথে নিরাপদে কাজ করার জন্য বেশ কিছু কার্যকরী মেথড সরবরাহ করে। এগুলো ব্যবহার করে আপনি NullPointerException থেকে বাঁচতে পারেন।

ifPresent() মেথড:

এই মেথডটি একটি Lambda Expression গ্রহণ করে এবং এটি কেবল তখনই কার্যকরী হবে যখন Optional এর মধ্যে একটি মান উপস্থিত থাকবে।

Optional<String> optionalName = Optional.ofNullable("John");
optionalName.ifPresent(name -> System.out.println("Name is: " + name));  // Output: Name is: John

Explanation:

  • ifPresent() মেথডটি একটি Lambda expression গ্রহণ করে এবং যদি Optional এর মধ্যে একটি মান থাকে, তাহলে সেই মানের উপর নির্দিষ্ট অপারেশন প্রয়োগ করা হয়। এটি NullPointerException এড়াতে সাহায্য করে কারণ null ভ্যালুর জন্য এটি কোনো অপারেশন করে না।

orElse() মেথড:

এই মেথডটি Optional এর মধ্যে যদি মান না থাকে, তাহলে একটি ডিফল্ট মান প্রদান করে।

Optional<String> optionalName = Optional.ofNullable(null);
String name = optionalName.orElse("Default Name");
System.out.println("Name is: " + name);  // Output: Name is: Default Name

Explanation:

  • orElse() মেথডটি যদি Optional খালি থাকে (মানে, null ভ্যালু), তাহলে একটি default value প্রদান করবে, যাতে NullPointerException এড়ানো যায়।

orElseGet() মেথড:

এটি orElse() এর মতোই কাজ করে, তবে এখানে আপনি একটি Supplier ব্যবহার করে default value প্রদান করতে পারেন।

Optional<String> optionalName = Optional.ofNullable(null);
String name = optionalName.orElseGet(() -> "Generated Name");
System.out.println("Name is: " + name);  // Output: Name is: Generated Name

Explanation:

  • orElseGet() মেথডটি Supplier ফাংশন গ্রহণ করে, এবং যদি Optional খালি থাকে, তবে generated value প্রদান করে।

map() এবং flatMap() মেথড:

map() এবং flatMap() মেথড দুটি গুরুত্বপূর্ণ মেথড যা Optional এর মানে পরিবর্তন করতে সহায়তা করে।

Optional<String> optionalName = Optional.ofNullable("John");

Optional<String> upperCaseName = optionalName.map(name -> name.toUpperCase());
System.out.println(upperCaseName.get());  // Output: JOHN

Explanation:

  • map() মেথডটি একটি function গ্রহণ করে যা Optional এর ভিতরের মান পরিবর্তন করে এবং নতুন Optional প্রদান করে।
  • flatMap() মেথডটি একইভাবে কাজ করে তবে এটি একটি Optional ফেরত দেয়, এবং যখন ভ্যালু নাল থাকে তখন এটি empty Optional ফেরত দেয়।

4. NullPointerException প্রতিরোধে Optional এর ব্যবহার

Optional এর মাধ্যমে NullPointerException প্রতিরোধ করার বেশ কিছু সুবিধা রয়েছে:

  • Null Safety: Optional ব্যবহার করে আপনি নিরাপদভাবে null ভ্যালু হ্যান্ডেল করতে পারেন, যা NullPointerException থেকে বাঁচায়।
  • Cleaner Code: Optional এর মাধ্যমে কোডটি বেশি পরিষ্কার হয় এবং null চেক করার প্রক্রিয়া সরল হয়।
  • Functional Programming: Optional ব্যবহারের মাধ্যমে আপনি ফাংশনাল স্টাইল কোড লেখার সুযোগ পান, যেমন map(), flatMap(), filter(), ইত্যাদি।

5. Optional এর অন্যান্য ব্যবহার

Chaining Optional:

একাধিক Optional এর মধ্যে চেইনিং অপারেশন করা যায়।

Optional<String> optionalName = Optional.ofNullable("John");
Optional<String> upperCaseName = optionalName.map(String::toUpperCase)
                                            .filter(name -> name.startsWith("J"));

System.out.println(upperCaseName.get());  // Output: JOHN

Explanation:

  • map() ব্যবহার করে নামটি uppercase এ রূপান্তরিত হচ্ছে এবং তারপর filter() দ্বারা চেক করা হচ্ছে যদি নামটি J দিয়ে শুরু হয়।

Combining Optionals:

একাধিক Optional একসাথে ব্যবহার করতে পারেন, যেমন দুটি Optional এর মধ্যে মান সন্নিবেশ করা।

Optional<String> firstName = Optional.ofNullable("John");
Optional<String> lastName = Optional.ofNullable("Doe");

String fullName = firstName.orElse("Unknown") + " " + lastName.orElse("Unknown");
System.out.println("Full Name: " + fullName);  // Output: Full Name: John Doe

সারাংশ

Optional ক্লাস Java 8 এর একটি শক্তিশালী ফিচার, যা NullPointerException প্রতিরোধে সহায়ক। Optional ব্যবহারের মাধ্যমে আপনি null চেকের ঝামেলা এড়াতে পারেন এবং null ভ্যালু ব্যবহারের সময় নিরাপত্তা নিশ্চিত করতে পারেন। Optional এর বিভিন্ন মেথড যেমন map(), flatMap(), filter(), orElse(), ifPresent() ইত্যাদি ব্যবহার করে আপনি কোডকে null-safe এবং আরও পরিষ্কার ও কার্যকরী করতে পারেন।

Optional এর সঠিক ব্যবহারের মাধ্যমে Java এ NullPointerException রোধ করা সম্ভব, যা কোডের নির্ভরযোগ্যতা এবং স্থিতিশীলতা বাড়ায়।

Content added By

Optional এর বিভিন্ন মেথড (orElse, orElseGet, orElseThrow)

340

Java Optional হলো Java 8-এ প্রবর্তিত একটি ক্লাস যা একটি null মানের সমস্যা সমাধানে সাহায্য করে। এটি মূলত null মানের বিরুদ্ধে সুরক্ষা প্রদান করে, যাতে আপনি null pointer exceptions (NPE) থেকে বাঁচতে পারেন। Optional একটি container object, যা optional values ধারণ করে এবং আপনাকে null চেক করার পরিবর্তে একটি পরিষ্কার এবং সুসংগঠিত উপায় প্রদান করে।

Optional এর মধ্যে তিনটি সাধারণভাবে ব্যবহৃত মেথড হলো orElse(), orElseGet(), এবং orElseThrow()। এই মেথডগুলো Optional অবজেক্টের মান বের করতে ব্যবহৃত হয়, এবং যদি মান না থাকে (যদি Optional-এ কোনো ভ্যালু না থাকে), তখন একটি ডিফল্ট ভ্যালু প্রদান বা কিছু এক্সেপশন থ্রো করতে পারে।

1. orElse() মেথড

orElse() মেথডটি ব্যবহার করা হয় যদি Optional অবজেক্টে কোনো মান না থাকে (যদি Optional-এর ভ্যালু null হয়), তাহলে এটি একটি ডিফল্ট ভ্যালু রিটার্ন করে।

সিনট্যাক্স:

T orElse(T other);
  • other: যদি Optional অবজেক্টে মান না থাকে, তবে এটি other ভ্যালু রিটার্ন করবে।

উদাহরণ:

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        Optional<String> optionalValue = Optional.ofNullable(null);
        
        // Using orElse() to provide a default value
        String result = optionalValue.orElse("Default Value");
        System.out.println(result);  // Output: Default Value
    }
}

এখানে, optionalValue হল একটি Optional অবজেক্ট যা null ধারণ করে, তাই orElse() মেথডটি "Default Value" রিটার্ন করে।


2. orElseGet() মেথড

orElseGet() মেথডটি orElse() এর মতোই কাজ করে, কিন্তু এখানে আপনি একটি Supplier (এটি একটি ফাংশনাল ইন্টারফেস) পাস করতে পারেন, যা একটি মান সরবরাহ করবে। যখন Optional অবজেক্টে মান না থাকে, তখন এটি Supplier থেকে পাওয়া মান রিটার্ন করবে।

সিনট্যাক্স:

T orElseGet(Supplier<? extends T> other);
  • other: এটি একটি Supplier ফাংশনাল ইন্টারফেস যা যখন Optional অবজেক্টে মান না থাকে, তখন একটি মান সরবরাহ করবে।

উদাহরণ:

import java.util.Optional;
import java.util.function.Supplier;

public class Main {
    public static void main(String[] args) {
        Optional<String> optionalValue = Optional.ofNullable(null);

        // Using orElseGet() with a Supplier
        Supplier<String> defaultSupplier = () -> "Supplied Default Value";
        String result = optionalValue.orElseGet(defaultSupplier);
        System.out.println(result);  // Output: Supplied Default Value
    }
}

এখানে, optionalValue আবার null ধারণ করছে, তাই orElseGet() মেথডটি defaultSupplier থেকে মান সরবরাহ করে "Supplied Default Value" রিটার্ন করে।


3. orElseThrow() মেথড

orElseThrow() মেথডটি ব্যবহার করা হয় যখন আপনি চান যে যদি Optional অবজেক্টে মান না থাকে, তবে একটি এক্সেপশন থ্রো করা হোক। এটি একটি এক্সেপশন রিটার্ন করে যখন Optional এর মধ্যে কোনো মান না থাকে।

সিনট্যাক্স:

T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X;
  • exceptionSupplier: একটি Supplier যা একটি এক্সেপশন সরবরাহ করবে যদি Optional অবজেক্টে কোনো মান না থাকে।

উদাহরণ:

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        Optional<String> optionalValue = Optional.ofNullable(null);

        // Using orElseThrow() to throw an exception if no value present
        try {
            String result = optionalValue.orElseThrow(() -> new IllegalArgumentException("No value present"));
            System.out.println(result);
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());  // Output: No value present
        }
    }
}

এখানে, optionalValue আবার null, তাই orElseThrow() একটি IllegalArgumentException থ্রো করবে।


orElse(), orElseGet(), এবং orElseThrow() এর মধ্যে পার্থক্য:

MethodDescriptionWhen to Use
orElse()যদি Optional এর মধ্যে মান না থাকে, তখন একটি ডিফল্ট মান রিটার্ন করে।যখন আপনি নিশ্চিত নন যে Optional-এ মান থাকবে কি না এবং একটি ডিফল্ট ভ্যালু প্রদান করতে চান।
orElseGet()যদি Optional এর মধ্যে মান না থাকে, তখন একটি Supplier থেকে মান রিটার্ন করে।যখন আপনি একটি কার্যকরী (lazy) ডিফল্ট মান পেতে চান যা শুধুমাত্র তখন উৎপন্ন হবে যখন Optional খালি থাকবে।
orElseThrow()যদি Optional এর মধ্যে মান না থাকে, একটি নির্দিষ্ট এক্সেপশন থ্রো করে।যখন আপনি চান যে, যদি Optional খালি থাকে, তবে একটি এক্সেপশন থ্রো করা হোক।

সংক্ষেপে:

  • orElse(): যখন Optional অবজেক্ট খালি থাকে, তখন একটি ডিফল্ট মান প্রদান করে।
  • orElseGet(): যখন Optional অবজেক্ট খালি থাকে, তখন একটি Supplier থেকে মান সরবরাহ করে (lazy evaluation)।
  • orElseThrow(): যখন Optional অবজেক্ট খালি থাকে, তখন একটি নির্দিষ্ট এক্সেপশন থ্রো করে।

এই তিনটি মেথড Optional ক্লাসের সুবিধাকে কাজে লাগিয়ে আপনাকে null সিকিউরিটি নিশ্চিত করতে এবং null pointer exceptions (NPE) এড়াতে সাহায্য করে।

Content added By

Optional এর সাথে Functional Programming

323

Java 8 তে Optional একটি নতুন কনসেপ্ট হিসেবে প্রবর্তন করা হয়, যা null মান (null values) কে নিরাপদভাবে পরিচালনা করার জন্য ব্যবহৃত হয়। Functional Programming এর ধারণা অনুসরণ করে Optional ব্যবহার করা হয়, যা কোডের ক্লিনলিনেস এবং সেফটি বৃদ্ধি করে এবং null-সংশ্লিষ্ট ত্রুটিগুলি কমাতে সাহায্য করে।

Optional এর ধারণা:

Optional একটি container object যা হতে পারে:

  • একটি মান (non-null value), অথবা
  • null (অর্থাৎ, কোনও মান নেই)

Optional মূলত এমন একটি wrapper যা কোনো মান থাকতে পারে বা নাও থাকতে পারে, এবং এটি ফাংশনাল প্রোগ্রামিং প্যাটার্নে ব্যবহার করা হয় যেন কোডের মধ্যে null চেকের দরকার না হয়।

Optional এর সুবিধা:

  1. Null Safety: Optional ক্লাসের মাধ্যমে null pointer exception (NPE) হ্যান্ডেল করা সহজ হয়।
  2. Functional Approach: Optional এর মাধ্যমে আপনি functional style এর মতো কোড লিখতে পারেন, যেমন map, filter, flatMap ইত্যাদি।
  3. Cleaner Code: Optional ব্যবহার করলে null চেকের জন্য প্রচুর if-else স্টেটমেন্টের প্রয়োজন হয় না, ফলে কোড পরিষ্কার হয়।

Optional ক্লাসের মূল মেথড:

Optional ক্লাসটি বিভিন্ন মেথড প্রদান করে যা আপনাকে মান (value) পরিচালনায় সাহায্য করে। কিছু গুরুত্বপূর্ণ মেথড হলো:

  • of(): একটি non-null মানের জন্য Optional তৈরি করে।
  • empty(): একটি empty Optional তৈরি করে (যেখানে মান নেই)।
  • ofNullable(): একটি নাল বা non-null মানের জন্য Optional তৈরি করে।
  • get(): Optional থেকে মান প্রাপ্তি। কিন্তু, এটি যদি null হয় তবে NoSuchElementException থ্রো করবে, তাই এর ব্যবহার ঝুঁকিপূর্ণ।
  • isPresent(): যদি Optional এর মধ্যে মান থাকে, তবে true ফেরত দেয়।
  • ifPresent(): যদি Optional এর মধ্যে মান থাকে, তবে একটি কাজ (ইতিবাচক ক্রিয়া) চালায়।
  • map(): Optional এর মধ্যে থাকা মানের উপর কোনো ফাংশন প্রয়োগ করতে ব্যবহৃত হয়।
  • flatMap(): Optional এর মধ্যে থাকা মানকে ফাংশনাল অপারেশনে প্রক্রিয়া করতে ব্যবহৃত হয়।
  • filter(): একটি শর্তের উপর ভিত্তি করে Optional এর মান ফিল্টার করতে ব্যবহৃত হয়।

Optional এর সাথে Functional Programming এর ব্যবহার:

ফাংশনাল প্রোগ্রামিং প্যাটার্নে Optional ব্যবহৃত হয় null চেকের পরিবর্তে ফাংশনাল অপারেশন করতে, যেমন map(), filter(), এবং flatMap()

1. map() মেথড:

map() মেথডটি Optional এর মধ্যে থাকা মানের উপর একটি ফাংশন প্রয়োগ করে একটি নতুন Optional প্রদান করে। এটি শুধুমাত্র তখনই ফাংশনটি প্রয়োগ করে যখন Optional এর মধ্যে মান থাকে।

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        Optional<String> name = Optional.of("Alice");

        // map() to convert value
        Optional<String> upperCaseName = name.map(String::toUpperCase);
        upperCaseName.ifPresent(System.out::println);  // Output: ALICE
    }
}

এখানে, map() মেথড ব্যবহার করে Optional এর মধ্যে থাকা স্ট্রিংটি uppercase এ পরিবর্তন করা হয়েছে।

2. filter() মেথড:

filter() মেথডটি Optional এর মধ্যে থাকা মানকে একটি শর্তের ভিত্তিতে ফিল্টার করতে ব্যবহৃত হয়। এটি যখন শর্ত পূর্ণ হয় তখন একটি নতুন Optional ফেরত দেয়, অন্যথায় একটি খালি Optional ফেরত দেয়।

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        Optional<Integer> number = Optional.of(10);

        // filter() to check condition
        Optional<Integer> filteredNumber = number.filter(n -> n > 5);
        filteredNumber.ifPresent(System.out::println);  // Output: 10
    }
}

এখানে, filter() মেথড ব্যবহার করে আমরা সংখ্যাটিকে ৫ এর বেশি কিনা তা চেক করেছি। যদি সংখ্যাটি ৫ এর বেশি হয়, তাহলে সেটি প্রক্রিয়াকরণ হবে, অন্যথায় এটি খালি Optional হবে।

3. flatMap() মেথড:

flatMap() মেথডটি একটি ফাংশন প্রাপ্ত Optional কে মানে রূপান্তরিত করে এবং তা একটি নতুন Optional প্রদান করে। এটি Optional গুলি চেইন করার জন্য ব্যবহৃত হয়।

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        Optional<String> name = Optional.of("Alice");

        // flatMap() to apply transformation and return Optional
        Optional<String> result = name.flatMap(n -> Optional.of(n.toLowerCase()));
        result.ifPresent(System.out::println);  // Output: alice
    }
}

এখানে, flatMap() ব্যবহার করে আমরা Optional এর মধ্যে থাকা মানকে ছোট হাতের অক্ষরে রূপান্তরিত করেছি এবং একটি নতুন Optional তৈরি করেছি।

4. ifPresent() মেথড:

ifPresent() মেথডটি Optional এর মধ্যে মান থাকা অবস্থায় একটি অ্যাকশন (যেমন, লম্বা লজিক বা আউটপুট) চালায়। এটি মূলত side effect তৈরি করার জন্য ব্যবহৃত হয়।

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        Optional<String> name = Optional.of("Alice");

        // ifPresent() to perform action if value is present
        name.ifPresent(n -> System.out.println("Name is: " + n));  // Output: Name is: Alice
    }
}

এখানে, ifPresent() ব্যবহৃত হচ্ছে যদি Optional এর মধ্যে কোনো মান থাকে, তবে একটি লজিক কার্যকরী করা হবে।


Optional এর সাথে Null Safety:

Null Safety নিশ্চিত করার জন্য Optional ব্যবহার করা হয়, যাতে কোডের মধ্যে NullPointerException কমানো যায়। Optional এর মাধ্যমে আপনি null চেক করতে পারেন এবং প্রয়োজনে কোনো ডিফল্ট মান প্রদান করতে পারেন।

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        Optional<String> name = Optional.ofNullable(null);

        // orElse() to provide default value if value is not present
        String result = name.orElse("Unknown");
        System.out.println(result);  // Output: Unknown
    }
}

এখানে, orElse() মেথড ব্যবহার করে আমরা null মানের জন্য একটি ডিফল্ট মান (এখানে "Unknown") প্রদান করেছি।


Optional এর অন্যান্য মেথড:

  • isPresent(): যদি Optional এর মধ্যে মান থাকে, তবে true ফেরত দেয়।
  • orElseGet(): এটি orElse() এর মতো, তবে এখানে ডিফল্ট মানটি একটি supplier function হতে পারে।
  • orElseThrow(): এটি Optional এর মধ্যে মান না থাকলে একটি এক্সেপশন ফেলে।
Optional<String> name = Optional.ofNullable(null);

// Throws an exception if no value is present
String result = name.orElseThrow(() -> new IllegalArgumentException("Name is required"));

সারাংশ:

Optional ক্লাস Java 8 এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা null চেকের জন্য নিরাপদ এবং কার্যকরী পদ্ধতি সরবরাহ করে। এটি ফাংশনাল প্রোগ্রামিং ধারণার মধ্যে ব্যবহৃত হয় যেখানে map, flatMap, filter, ifPresent, এবং orElse ইত্যাদি অপারেশনগুলি ব্যবহার করা হয়। Optional ব্যবহারের মাধ্যমে আপনি কোডের মধ্যে null pointer exception (NPE) থেকে বাঁচতে পারেন এবং একটি সুনির্দিষ্ট, পরিষ্কার এবং নিরাপদ কোড তৈরি করতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...