প্রোগ্রামারদের জন্য কোটলিন বুটক্যাম্প 3: ফাংশন

এই কোডল্যাবটি প্রোগ্রামারদের কোর্সের জন্য কোটলিন বুটক্যাম্পের অংশ। আপনি যদি ক্রমানুসারে কোডল্যাবগুলির মাধ্যমে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন৷ আপনার জ্ঞানের উপর নির্ভর করে, আপনি কিছু বিভাগ স্কিম করতে সক্ষম হতে পারেন। এই কোর্সটি এমন প্রোগ্রামারদের জন্য তৈরি যারা একটি অবজেক্ট-ওরিয়েন্টেড ভাষা জানেন এবং কোটলিন শিখতে চান।

ভূমিকা

এই কোডল্যাবে, আপনি একটি কোটলিন প্রোগ্রাম তৈরি করুন এবং প্যারামিটার, ফিল্টার, ল্যাম্বডাস এবং কমপ্যাক্ট ফাংশনের জন্য ডিফল্ট মান সহ কোটলিনের ফাংশন সম্পর্কে শিখুন।

একটি একক নমুনা অ্যাপ তৈরি করার পরিবর্তে, এই কোর্সের পাঠগুলি আপনার জ্ঞান তৈরি করার জন্য ডিজাইন করা হয়েছে, তবে একে অপরের থেকে আধা-স্বতন্ত্র থাকুন যাতে আপনি আপনার পরিচিত বিভাগগুলিকে স্কিম করতে পারেন। তাদের একসাথে বাঁধতে, অনেক উদাহরণ একটি অ্যাকোয়ারিয়াম থিম ব্যবহার করে। এবং আপনি যদি সম্পূর্ণ অ্যাকোয়ারিয়ামের গল্প দেখতে চান, তাহলে প্রোগ্রামারদের জন্য কোটলিন বুটক্যাম্প উদাসিটি কোর্সটি দেখুন।

আপনি ইতিমধ্যে কি জানা উচিত

  • একটি আধুনিক, অবজেক্ট-ওরিয়েন্টেড, স্ট্যাটিকলি টাইপ করা প্রোগ্রামিং ভাষার মূল বিষয়
  • কমপক্ষে একটি ভাষায় ক্লাস, পদ্ধতি এবং ব্যতিক্রম পরিচালনার সাথে কীভাবে প্রোগ্রাম করবেন
  • ইন্টেলিজে আইডিইএ-তে কোটলিনের আরইপিএল (রিড-ইভাল-প্রিন্ট লুপ) এর সাথে কীভাবে কাজ করবেন
  • প্রকার, অপারেটর এবং লুপ সহ কোটলিনের মূল বিষয়গুলি৷

এই কোডল্যাবটি এমন প্রোগ্রামারদের জন্য তৈরি যারা একটি অবজেক্ট-ভিত্তিক ভাষা জানেন এবং কোটলিন সম্পর্কে আরও জানতে চান।

আপনি কি শিখবেন

  • IntelliJ IDEA তে একটি main() ফাংশন এবং আর্গুমেন্ট সহ একটি প্রোগ্রাম কীভাবে তৈরি করবেন
  • ডিফল্ট মান এবং কমপ্যাক্ট ফাংশন কিভাবে ব্যবহার করবেন
  • কীভাবে তালিকার জন্য ফিল্টার প্রয়োগ করবেন
  • কিভাবে মৌলিক ল্যাম্বডাস এবং উচ্চ-ক্রম ফাংশন তৈরি করতে হয়

আপনি কি করবেন

  • কিছু কোড ব্যবহার করে দেখতে REPL এর সাথে কাজ করুন।
  • মৌলিক Kotlin প্রোগ্রাম তৈরি করতে IntelliJ IDEA এর সাথে কাজ করুন।

এই টাস্কে, আপনি একটি Kotlin প্রোগ্রাম তৈরি করুন এবং main() ফাংশন সম্পর্কে শিখুন, সেইসাথে কমান্ড লাইন থেকে একটি প্রোগ্রামে আর্গুমেন্ট কিভাবে পাস করতে হয়।

আপনি printHello() ফাংশনটি মনে রাখতে পারেন যা আপনি পূর্ববর্তী কোডল্যাবে REPL এ প্রবেশ করেছেন:

fun printHello() {
    println ("Hello World")
}

printHello()
⇒ Hello World

আপনি fun কীওয়ার্ড ব্যবহার করে ফাংশন সংজ্ঞায়িত করেন, ফাংশনের নাম অনুসরণ করে। অন্যান্য প্রোগ্রামিং ভাষার মতো, বন্ধনী () ফাংশন আর্গুমেন্টের জন্য, যদি থাকে। কোঁকড়া ধনুর্বন্ধনী {} ফাংশনের জন্য কোড ফ্রেম করে। এই ফাংশনের জন্য কোন রিটার্ন টাইপ নেই, কারণ এটি কিছুই ফেরত দেয় না।

ধাপ 1: একটি Kotlin ফাইল তৈরি করুন

  1. IntelliJ IDEA খুলুন।
  2. IntelliJ IDEA-তে বাম দিকের প্রজেক্ট ফলকটি আপনার প্রোজেক্ট ফাইল এবং ফোল্ডারগুলির একটি তালিকা দেখায়। হ্যালো কোটলিনের অধীনে src ফোল্ডারটি খুঁজুন এবং ডান-ক্লিক করুন। (আপনার পূর্ববর্তী কোডল্যাব থেকে ইতিমধ্যে হ্যালো কোটলিন প্রকল্প থাকা উচিত।)
  3. নতুন > কোটলিন ফাইল / ক্লাস নির্বাচন করুন।
  4. Kind কে ফাইল হিসাবে রাখুন এবং ফাইলটির নাম দিন হ্যালো
  5. ঠিক আছে ক্লিক করুন.

এখন src ফোল্ডারে Hello.kt নামে একটি ফাইল রয়েছে।

ধাপ 2: কোড যোগ করুন এবং আপনার প্রোগ্রাম চালান

  1. অন্যান্য ভাষার মতো, Kotlin main() ফাংশনটি সম্পাদনের জন্য এন্ট্রি পয়েন্ট নির্দিষ্ট করে। যেকোনো কমান্ড লাইন আর্গুমেন্ট স্ট্রিং এর অ্যারে হিসাবে পাস করা হয়।

    Hello.kt ফাইলে নিম্নলিখিত কোডটি টাইপ বা পেস্ট করুন:
fun main(args: Array<String>) {
    println("Hello, world!")
}

আপনার আগের printHello() ফাংশনের মতো, এই ফাংশনের কোনো return স্টেটমেন্ট নেই। কোটলিনের প্রতিটি ফাংশন কিছু ফেরত দেয়, এমনকি যখন কিছুই স্পষ্টভাবে নির্দিষ্ট করা না থাকে। সুতরাং এই main() ফাংশনের মত একটি ফাংশন একটি টাইপ kotlin.Unit , যা কোটলিনের কোন মান বলার উপায়।

  1. আপনার প্রোগ্রাম চালানোর জন্য, main() ফাংশনের বাম দিকে সবুজ ত্রিভুজ ক্লিক করুন। মেনু থেকে 'HelloKt' চালান নির্বাচন করুন।
  2. IntelliJ IDEA প্রোগ্রাম কম্পাইল করে এবং এটি চালায়। ফলাফলগুলি নীচের দিকে একটি লগ প্যানে প্রদর্শিত হবে, যেমনটি নীচে দেখানো হয়েছে৷

ধাপ 3: আর্গুমেন্টগুলিকে প্রধান() এ পাস করুন

যেহেতু আপনি আপনার প্রোগ্রামটি IntelliJ IDEA থেকে চালাচ্ছেন এবং কমান্ড লাইন থেকে নয়, আপনাকে প্রোগ্রামে যেকোনো আর্গুমেন্টকে একটু ভিন্নভাবে উল্লেখ করতে হবে।

  1. রান > কনফিগারেশন সম্পাদনা নির্বাচন করুন। রান/ডিবাগ কনফিগারেশন উইন্ডো খোলে।
  2. Kotlin! প্রোগ্রাম আর্গুমেন্ট ক্ষেত্রে.
  3. ঠিক আছে ক্লিক করুন.

ধাপ 4: একটি স্ট্রিং টেমপ্লেট ব্যবহার করতে কোড পরিবর্তন করুন

একটি স্ট্রিং টেমপ্লেট একটি স্ট্রিংয়ের মধ্যে একটি পরিবর্তনশীল বা অভিব্যক্তি সন্নিবেশ করায় এবং $ নির্দিষ্ট করে যে স্ট্রিংয়ের অংশটি একটি পরিবর্তনশীল বা অভিব্যক্তি হবে। কোঁকড়া ধনুর্বন্ধনী {} এক্সপ্রেশন ফ্রেম, যদি থাকে।

  1. Hello.kt- এ, "world" এর পরিবর্তে প্রোগ্রামে পাস করা প্রথম আর্গুমেন্ট, args[0] ব্যবহার করতে শুভেচ্ছা বার্তাটি পরিবর্তন করুন।
fun main(args: Array<String>) {
    println("Hello, ${args[0]}")
}
  1. প্রোগ্রাম চালান, এবং আউটপুট আপনার নির্দিষ্ট যুক্তি অন্তর্ভুক্ত.
⇒ Hello, Kotlin!

এই টাস্কে, আপনি শিখবেন কেন কোটলিনের প্রায় সব কিছুরই একটি মূল্য আছে এবং কেন এটি দরকারী।

কিছু অন্যান্য ভাষার বিবৃতি আছে, যা কোডের লাইন যার কোনো মান নেই। কোটলিনে, প্রায় সবকিছুই একটি অভিব্যক্তি এবং এর একটি মান আছে-এমনকি যদি সেই মানটি kotlin.Unit হয়।

  1. Hello.kt- এ, isUnit নামক একটি ভেরিয়েবলে println() বরাদ্দ করতে main() এ কোড লিখুন এবং এটি প্রিন্ট করুন। ( println() একটি মান ফেরত দেয় না, তাই এটি kotlin.Unit করে।)
// Will assign kotlin.Unit
val isUnit = println("This is an expression")
println(isUnit)
  1. আপনার প্রোগ্রাম চালান. প্রথম println() স্ট্রিংটি প্রিন্ট করে "This is an expression" । দ্বিতীয় println() প্রথম println() স্টেটমেন্টের মান প্রিন্ট করে, অর্থাৎ kotlin.Unit
⇒ This is an expression
kotlin.Unit
  1. temperature নামক একটি val ঘোষণা করুন এবং এটিকে 10 এ আরম্ভ করুন।
  2. isHot নামে আরেকটি val ঘোষণা করুন এবং একটি if / else স্টেটমেন্টের রিটার্ন মান isHot এ বরাদ্দ করুন, যেমনটি নিম্নলিখিত isHot দেখানো হয়েছে। যেহেতু এটি একটি অভিব্যক্তি, আপনি এখনই if অভিব্যক্তিটির মান ব্যবহার করতে পারেন।
val temperature = 10
val isHot = if (temperature > 50) true else false
println(isHot)
⇒ false
  1. একটি স্ট্রিং টেমপ্লেটে একটি অভিব্যক্তির মান ব্যবহার করুন। একটি মাছ নিরাপদ বা খুব উষ্ণ কিনা তা নির্ধারণ করতে তাপমাত্রা পরীক্ষা করতে কিছু কোড যোগ করুন, তারপর আপনার প্রোগ্রাম চালান।
val temperature = 10
val message = "The water temperature is ${ if (temperature > 50) "too warm" else "OK" }."
println(message)
⇒ The water temperature is OK.

এই টাস্কে, আপনি কোটলিনের ফাংশন সম্পর্কে আরও শিখবেন এবং শর্তসাপেক্ষ এক্সপ্রেশনের when খুব দরকারী সম্পর্কে আরও শিখবেন।

ধাপ 1: কিছু ফাংশন তৈরি করুন

এই ধাপে, আপনি যা শিখেছেন তার কিছু একত্রিত করেছেন এবং বিভিন্ন ধরনের ফাংশন তৈরি করেছেন। আপনি এই নতুন কোড দিয়ে Hello.kt- এর বিষয়বস্তু প্রতিস্থাপন করতে পারেন।

  1. feedTheFish() নামে একটি ফাংশন লিখুন যা সপ্তাহের একটি এলোমেলো দিন পেতে randomDay() কল করে। সেই দিন মাছের খাওয়ার জন্য একটি food প্রিন্ট করতে একটি স্ট্রিং টেমপ্লেট ব্যবহার করুন। আপাতত, মাছ প্রতিদিন একই খাবার খায়।
fun feedTheFish() {
    val day = randomDay()
    val food = "pellets"
    println ("Today is $day and the fish eat $food")
}

fun main(args: Array<String>) {
    feedTheFish()
}
  1. একটি অ্যারে থেকে র্যান্ডম দিন বাছাই করতে randomDay() ফাংশনটি লিখুন এবং এটি ফেরত দিন।

nextInt() ফাংশনটি একটি পূর্ণসংখ্যার সীমা নেয়, যা week অ্যারের সাথে মেলাতে Random() থেকে 0 থেকে 6 পর্যন্ত সংখ্যা সীমাবদ্ধ করে।

fun randomDay() : String {
    val week = arrayOf ("Monday", "Tuesday", "Wednesday", "Thursday",
            "Friday", "Saturday", "Sunday")
    return week[Random().nextInt(week.size)]
}
  1. Random() এবং nextInt() ফাংশন java.util.* । ফাইলের শীর্ষে, প্রয়োজনীয় আমদানি যোগ করুন:
import java.util.*    // required import
  1. আপনার প্রোগ্রাম চালান, এবং আউটপুট পরীক্ষা করুন.
⇒ Today is Tuesday and the fish eat pellets

ধাপ 2: একটি যখন অভিব্যক্তি ব্যবহার করুন

এটিকে আরও প্রসারিত করে, when অভিব্যক্তি ব্যবহার করে বিভিন্ন দিনের জন্য বিভিন্ন খাবার বাছাই করতে কোড পরিবর্তন করুন। when স্টেটমেন্ট অন্যান্য প্রোগ্রামিং ভাষায় switch করার মত, কিন্তু when স্বয়ংক্রিয়ভাবে প্রতিটি শাখার শেষে ব্রেক হয়ে যায়। আপনি যদি একটি enum পরীক্ষা করছেন তবে এটি আপনার কোডটি সমস্ত শাখাকে কভার করে তা নিশ্চিত করে।

  1. Hello.kt- এ, fishFood() নামে একটি ফাংশন যোগ করুন যা একটি String হিসাবে একটি দিন নেয় এবং একটি String হিসাবে দিনের জন্য মাছের খাবার ফেরত দেয়। when() ব্যবহার করুন, যাতে প্রতিদিন মাছ একটি নির্দিষ্ট খাবার পায়। বিভিন্ন আউটপুট দেখতে আপনার প্রোগ্রাম কয়েকবার চালান।
fun fishFood (day : String) : String {
    var food = ""
    when (day) {
        "Monday" -> food = "flakes"
        "Tuesday" -> food = "pellets"
        "Wednesday" -> food = "redworms"
        "Thursday" -> food = "granules"
        "Friday" -> food = "mosquitoes"
        "Saturday" -> food = "lettuce"
        "Sunday" -> food = "plankton"
    }
    return food
}

fun feedTheFish() {
    val day = randomDay()
    val food = fishFood(day)

    println ("Today is $day and the fish eat $food")
}
⇒ Today is Thursday and the fish eat granules
  1. when এক্সপ্রেশন else ব্যবহার করে একটি ডিফল্ট শাখা যোগ করুন। পরীক্ষার জন্য, আপনার প্রোগ্রামে কখনও কখনও ডিফল্ট নেওয়া হয়েছে তা নিশ্চিত করতে, Tuesday এবং Saturday শাখাগুলি সরান৷

    একটি ডিফল্ট শাখা থাকা নিশ্চিত করে যে food ফেরত দেওয়ার আগে একটি মূল্য পায়, তাই এটিকে আর আরম্ভ করার দরকার নেই। কারণ কোডটি এখন শুধুমাত্র একবার food জন্য একটি স্ট্রিং নির্ধারণ করে, আপনি var এর পরিবর্তে val দিয়ে food ঘোষণা করতে পারেন।
fun fishFood (day : String) : String {
    val food : String
    when (day) {
        "Monday" -> food = "flakes"
        "Wednesday" -> food = "redworms"
        "Thursday" -> food = "granules"
        "Friday" -> food = "mosquitoes"
        "Sunday" -> food = "plankton"
        else -> food = "nothing"
    }
    return food
}
  1. যেহেতু প্রতিটি অভিব্যক্তির একটি মান আছে, আপনি এই কোডটিকে আরও সংক্ষিপ্ত করতে পারেন। সরাসরি when অভিব্যক্তির মান ফেরত দিন এবং food পরিবর্তনশীলটি নির্মূল করুন। when অভিব্যক্তির মান হল শাখার শেষ অভিব্যক্তির মান যা শর্ত পূরণ করেছে৷
fun fishFood (day : String) : String {
    return when (day) {
        "Monday" -> "flakes"
        "Wednesday" -> "redworms"
        "Thursday" -> "granules"
        "Friday" -> "mosquitoes"
        "Sunday" -> "plankton"
        else -> "nothing"
    }
}

আপনার প্রোগ্রামের চূড়ান্ত সংস্করণ নীচের কোড মত কিছু দেখায়.

import java.util.*    // required import

fun randomDay() : String {
    val week = arrayOf ("Monday", "Tuesday", "Wednesday", "Thursday",
        "Friday", "Saturday", "Sunday")
    return week[Random().nextInt(week.size)]
}

fun fishFood (day : String) : String {
    return when (day) {
        "Monday" -> "flakes"
        "Wednesday" -> "redworms"
        "Thursday" -> "granules"
        "Friday" -> "mosquitoes"
        "Sunday" -> "plankton"
        else -> "nothing"
    }
}

fun feedTheFish() {
    val day = randomDay()
    val food = fishFood(day)
    println ("Today is $day and the fish eat $food")
}

fun main(args: Array<String>) {
    feedTheFish()
}

এই টাস্কে, আপনি ফাংশন এবং পদ্ধতির ডিফল্ট মান সম্পর্কে শিখবেন। আপনি কমপ্যাক্ট ফাংশন সম্পর্কেও শিখবেন, যা আপনার কোডকে আরও সংক্ষিপ্ত এবং পঠনযোগ্য করে তুলতে পারে এবং পরীক্ষার জন্য কোড পাথের সংখ্যা কমাতে পারে। কমপ্যাক্ট ফাংশনকে একক-অভিব্যক্তি ফাংশনও বলা হয়।

ধাপ 1: একটি প্যারামিটারের জন্য একটি ডিফল্ট মান তৈরি করুন

কোটলিনে, আপনি প্যারামিটার নাম দ্বারা আর্গুমেন্ট পাস করতে পারেন। আপনি পরামিতিগুলির জন্য ডিফল্ট মানও নির্দিষ্ট করতে পারেন: যদি কলকারীর দ্বারা একটি যুক্তি সরবরাহ না করা হয় তবে ডিফল্ট মান ব্যবহার করা হয়। পরবর্তীতে, আপনি যখন মেথড (সদস্য ফাংশন) লেখেন, এর মানে হল আপনি একই পদ্ধতির প্রচুর ওভারলোড সংস্করণ লেখা এড়াতে পারেন।

  1. Hello.kt- এ, একটি String প্যারামিটারের সাথে একটি swim() ফাংশন লিখুন যার নাম speed যা মাছের গতি প্রিন্ট করে। speed প্যারামিটারের একটি ডিফল্ট মান আছে "fast"
fun swim(speed: String = "fast") {
   println("swimming $speed")
}
  1. main() ফাংশন থেকে, swim() ফাংশনটিকে তিনটি উপায়ে কল করুন। প্রথমে ডিফল্ট ব্যবহার করে ফাংশনটি কল করুন। তারপর ফাংশনটিকে কল করুন এবং একটি নাম ছাড়াই speed প্যারামিটারটি পাস করুন, তারপর speed পরামিতিটির নাম দিয়ে ফাংশনটিকে কল করুন।
swim()   // uses default speed
swim("slow")   // positional argument
swim(speed="turtle-like")   // named parameter
⇒ swimming fast
swimming slow
swimming turtle-like

ধাপ 2: প্রয়োজনীয় পরামিতি যোগ করুন

কোনো প্যারামিটারের জন্য কোনো ডিফল্ট নির্দিষ্ট না থাকলে, সংশ্লিষ্ট আর্গুমেন্টটি অবশ্যই পাস করতে হবে।

  1. Hello.kt- এ, একটি shouldChangeWater() ফাংশন লিখুন যা তিনটি পরামিতি নেয়: day , temperature এবং একটি dirty স্তর। যদি জল পরিবর্তন করা উচিত তাহলে ফাংশনটি true হয়ে যায়, যদি এটি রবিবার হয়, যদি তাপমাত্রা খুব বেশি হয়, বা জল খুব নোংরা হয়। সপ্তাহের দিন প্রয়োজন, কিন্তু ডিফল্ট তাপমাত্রা 22, এবং ডিফল্ট নোংরা স্তর 20।

    একটি যুক্তি ছাড়াই একটি when অভিব্যক্তি ব্যবহার করুন, যা Kotlin-এ if/else if চেক করার একটি সিরিজ হিসাবে কাজ করে।
fun shouldChangeWater (day: String, temperature: Int = 22, dirty: Int = 20): Boolean {
    return when {
        temperature > 30 -> true
        dirty > 30 -> true
        day == "Sunday" ->  true
        else -> false
    }
}
  1. shouldChangeWater() থেকে feedTheFish() ) কে কল করুন এবং দিন সরবরাহ করুন। day প্যারামিটারে কোনো ডিফল্ট নেই, তাই আপনাকে অবশ্যই একটি আর্গুমেন্ট উল্লেখ করতে হবে। shouldChangeWater() এর অন্য দুটি প্যারামিটারের ডিফল্ট মান রয়েছে, তাই আপনাকে তাদের জন্য আর্গুমেন্ট পাস করতে হবে না।
fun feedTheFish() {
    val day = randomDay()
    val food = fishFood(day)
    println ("Today is $day and the fish eat $food")
    println("Change water: ${shouldChangeWater(day)}")
}
=> Today is Thursday and the fish eat granules
Change water: false

ধাপ 3: কমপ্যাক্ট ফাংশন করুন

পূর্ববর্তী ধাপে আপনি যে when অভিব্যক্তিটি লিখেছিলেন তা অল্প পরিমাণে কোডে অনেক যুক্তি প্যাক করে। আপনি যদি এটিকে কিছুটা আনপ্যাক করতে চান, বা যদি পরীক্ষা করার শর্তগুলি আরও জটিল হয় তবে আপনি কিছু সুনামযুক্ত স্থানীয় ভেরিয়েবল ব্যবহার করতে পারেন। কিন্তু কোটলিনের উপায় হল কমপ্যাক্ট ফাংশন দিয়ে।

কমপ্যাক্ট ফাংশন, বা একক-অভিব্যক্তি ফাংশন , কোটলিনের একটি সাধারণ প্যাটার্ন। যখন একটি ফাংশন একটি একক অভিব্যক্তির ফলাফল প্রদান করে, তখন আপনি একটি = চিহ্নের পরে ফাংশনের মূল অংশটি নির্দিষ্ট করতে পারেন, কোঁকড়া ধনুর্বন্ধনী {} বাদ দিতে পারেন এবং রিটার্নটি বাদ দিতে return

  1. Hello.kt- এ, শর্তগুলি পরীক্ষা করতে কমপ্যাক্ট ফাংশন যোগ করুন।
fun isTooHot(temperature: Int) = temperature > 30

fun isDirty(dirty: Int) = dirty > 30

fun isSunday(day: String) = day == "Sunday"
  1. নতুন ফাংশন কল করতে shouldChangeWater() পরিবর্তন করুন।
fun shouldChangeWater (day: String, temperature: Int = 22, dirty: Int = 20): Boolean {
    return when {
        isTooHot(temperature) -> true
        isDirty(dirty) -> true
        isSunday(day) -> true
        else  -> false
    }
}
  1. আপনার প্রোগ্রাম চালান. shouldChangeWater() println() থেকে আউটপুট একই হওয়া উচিত যেমনটি আপনি কমপ্যাক্ট ফাংশন ব্যবহারে স্যুইচ করার আগে ছিল।

ডিফল্ট মান

একটি প্যারামিটারের জন্য ডিফল্ট মান একটি মান হতে হবে না। এটি অন্য ফাংশন হতে পারে, যেমনটি নিম্নলিখিত আংশিক নমুনায় দেখানো হয়েছে:

fun shouldChangeWater (day: String, temperature: Int = 22, dirty: Int = getDirtySensorReading()): Boolean {
    ...

এই টাস্কে, আপনি কোটলিনের ফিল্টার সম্পর্কে কিছুটা শিখবেন। ফিল্টার কিছু শর্তের উপর ভিত্তি করে একটি তালিকার অংশ পেতে একটি সহজ উপায়।

ধাপ 1: একটি ফিল্টার তৈরি করুন

  1. Hello.kt- এ, listOf() দিয়ে শীর্ষ স্তরে অ্যাকোয়ারিয়াম সজ্জার একটি তালিকা সংজ্ঞায়িত করুন। আপনি Hello.kt এর বিষয়বস্তু প্রতিস্থাপন করতে পারেন।
val decorations = listOf ("rock", "pagoda", "plastic plant", "alligator", "flowerpot")
  1. শুধুমাত্র 'p' অক্ষর দিয়ে শুরু হওয়া অলঙ্করণগুলি প্রিন্ট করতে একটি লাইন দিয়ে একটি নতুন main() ফাংশন তৈরি করুন। ফিল্টার অবস্থার কোডটি কোঁকড়া ধনুর্বন্ধনীতে থাকে {} , এবং it প্রতিটি আইটেমকে বোঝায় যখন ফিল্টারটি লুপ হয়। অভিব্যক্তিটি true হলে, আইটেমটি অন্তর্ভুক্ত করা হয়।
fun main() {
    println( decorations.filter {it[0] == 'p'})
}
  1. আপনার প্রোগ্রাম চালান, এবং আপনি রান উইন্ডোতে নিম্নলিখিত আউটপুট দেখতে পাবেন:
⇒ [pagoda, plastic plant]

ধাপ 2: আগ্রহী এবং অলস ফিল্টার তুলনা করুন

আপনি যদি অন্যান্য ভাষার ফিল্টারগুলির সাথে পরিচিত হন তবে আপনি ভাবতে পারেন যে কোটলিনের ফিল্টারগুলি আগ্রহী নাকি অলস । ফলাফল তালিকা অবিলম্বে তৈরি করা হয়, বা যখন তালিকা অ্যাক্সেস করা হয়? কোটলিনে, এটি আপনার প্রয়োজন যেভাবেই ঘটবে। ডিফল্টরূপে, filter আগ্রহী, এবং প্রতিবার যখন আপনি ফিল্টার ব্যবহার করেন, একটি তালিকা তৈরি করা হয়।

ফিল্টারটিকে অলস করতে, আপনি একটি Sequence ব্যবহার করতে পারেন, যা একটি সংগ্রহ যা একটি সময়ে শুধুমাত্র একটি আইটেম দেখতে পারে, শুরু থেকে শুরু করে এবং শেষ পর্যন্ত যেতে পারে। সুবিধামত, এটি ঠিক সেই API যা একটি অলস ফিল্টারের প্রয়োজন।

  1. Hello.kt- এ, eager নামক একটি ভেরিয়েবলে ফিল্টার করা তালিকা বরাদ্দ করতে আপনার কোড পরিবর্তন করুন, তারপর এটি মুদ্রণ করুন।
fun main() {
    val decorations = listOf ("rock", "pagoda", "plastic plant", "alligator", "flowerpot")

    // eager, creates a new list
    val eager = decorations.filter { it [0] == 'p' }
    println("eager: " + eager)
  1. সেই কোডের নিচে, asSequence() সাথে একটি Sequence ব্যবহার করে ফিল্টারটি মূল্যায়ন করুন। filtered নামক একটি ভেরিয়েবলে ক্রমটি বরাদ্দ করুন এবং এটি মুদ্রণ করুন।
   // lazy, will wait until asked to evaluate
    val filtered = decorations.asSequence().filter { it[0] == 'p' }
    println("filtered: " + filtered)

যখন আপনি একটি Sequence হিসাবে ফিল্টার ফলাফলগুলি ফেরত দেন, তখন filtered ভেরিয়েবলটি একটি নতুন তালিকা ধারণ করবে না - এটি তালিকা উপাদানগুলির একটি Sequence এবং সেই উপাদানগুলিতে প্রয়োগ করার জন্য ফিল্টারের জ্ঞান ধারণ করবে৷ যখনই আপনি Sequence উপাদানগুলি অ্যাক্সেস করেন, ফিল্টারটি প্রয়োগ করা হয় এবং ফলাফলটি আপনাকে ফেরত দেওয়া হয়।

  1. toList() দিয়ে একটি List রূপান্তর করে অনুক্রমের মূল্যায়ন জোর করে। ফলাফল প্রিন্ট করুন।
    // force evaluation of the lazy list
    val newList = filtered.toList()
    println("new list: " + newList)
  1. আপনার প্রোগ্রাম চালান এবং আউটপুট পর্যবেক্ষণ.
⇒ eager: [pagoda, plastic plant]
filtered: kotlin.sequences.FilteringSequence@386cc1c4
new list: [pagoda, plastic plant]

Sequence এবং অলস মূল্যায়নের সাথে কী ঘটছে তা কল্পনা করতে, map() ফাংশনটি ব্যবহার করুন। map() ফাংশন সিকোয়েন্সের প্রতিটি উপাদানে একটি সাধারণ রূপান্তর সঞ্চালন করে।

  1. উপরের মতো একই decorations তালিকার সাথে, map() দিয়ে একটি রূপান্তর করুন যা কিছুই করে না এবং কেবল পাস করা উপাদানটি ফিরিয়ে দেয়। প্রতিবার একটি উপাদান অ্যাক্সেস করার জন্য একটি println() যোগ করুন এবং lazyMap নামক একটি ভেরিয়েবলে ক্রম নির্ধারণ করুন।
    val lazyMap = decorations.asSequence().map {
        println("access: $it")
        it
    }
  1. lazyMap প্রিন্ট করুন, first() ব্যবহার করে lazyMap এর প্রথম উপাদানটি প্রিন্ট করুন এবং একটি List রূপান্তরিত lazyMap প্রিন্ট করুন।
    println("lazy: $lazyMap")
    println("-----")
    println("first: ${lazyMap.first()}")
    println("-----")
    println("all: ${lazyMap.toList()}")
  1. আপনার প্রোগ্রাম চালান, এবং আউটপুট পর্যবেক্ষণ. প্রিন্টিং lazyMap শুধুমাত্র Sequence একটি রেফারেন্স প্রিন্ট করে — ভিতরের println() বলা হয় না। প্রথম উপাদান মুদ্রণ শুধুমাত্র প্রথম উপাদান অ্যাক্সেস. Sequence একটি List রূপান্তর করা সমস্ত উপাদান অ্যাক্সেস করে।
⇒ lazy: kotlin.sequences.TransformingSequence@5ba23b66
-----
access: rock
first: rock
-----
access: rock
access: pagoda
access: plastic plant
access: alligator
access: flowerpot
all: [rock, pagoda, plastic plant, alligator, flowerpot]
  1. map প্রয়োগ করার আগে আসল ফিল্টার ব্যবহার করে একটি নতুন Sequence তৈরি করুন। সেই ফলাফল প্রিন্ট করুন।
    val lazyMap2 = decorations.asSequence().filter {it[0] == 'p'}.map {
        println("access: $it")
        it
    }
    println("-----")
    println("filtered: ${ lazyMap2.toList() }")
  1. আপনার প্রোগ্রাম চালান এবং অতিরিক্ত আউটপুট পর্যবেক্ষণ করুন. প্রথম উপাদান পাওয়ার মতো, অভ্যন্তরীণ println() শুধুমাত্র অ্যাক্সেস করা উপাদানগুলির জন্য বলা হয়।
⇒
-----
access: pagoda
access: plastic plant
filtered: [pagoda, plastic plant]

এই টাস্কে, আপনি কোটলিনে ল্যাম্বডাস এবং উচ্চ-ক্রম ফাংশনগুলির একটি পরিচিতি পান।

ল্যাম্বদাস

ঐতিহ্যগত নামের ফাংশন ছাড়াও, কোটলিন ল্যাম্বডাসকে সমর্থন করে। একটি ল্যাম্বডা একটি অভিব্যক্তি যা একটি ফাংশন তৈরি করে। কিন্তু একটি নামযুক্ত ফাংশন ঘোষণা করার পরিবর্তে, আপনি একটি ফাংশন ঘোষণা করেন যার কোনো নাম নেই। এটিকে উপযোগী করে তোলে তার একটি অংশ হল ল্যাম্বডা এক্সপ্রেশনটি এখন ডেটা হিসাবে পাস করা যেতে পারে। অন্যান্য ভাষায়, ল্যাম্বডাসকে বেনামী ফাংশন , ফাংশন লিটারাল বা অনুরূপ নাম বলা হয়।

উচ্চ ক্রম ফাংশন

আপনি একটি ল্যাম্বডাকে অন্য ফাংশনে পাস করে একটি উচ্চ-ক্রম ফাংশন তৈরি করতে পারেন। আগের টাস্কে, আপনি filter নামে একটি উচ্চ-ক্রম ফাংশন তৈরি করেছেন। আপনি নিম্নলিখিত ল্যাম্বডা এক্সপ্রেশনটি পরীক্ষা করার শর্ত হিসাবে filter করতে পাস করেছেন:
{it[0] == 'p'}

একইভাবে, map একটি উচ্চ-ক্রম ফাংশন, এবং আপনি এটিতে যে ল্যাম্বডা পাস করেছেন তা প্রয়োগ করার জন্য রূপান্তর।

ধাপ 1: ল্যাম্বডাস সম্পর্কে জানুন

  1. নামযুক্ত ফাংশনের মতো, ল্যাম্বডাসের পরামিতি থাকতে পারে। ল্যাম্বডাসের জন্য, প্যারামিটারগুলি (এবং তাদের প্রকারগুলি, যদি প্রয়োজন হয়) একটি ফাংশন তীর -> বলা হয় তার বাম দিকে যায়। কার্যকর করার কোডটি ফাংশন তীরের ডানদিকে যায়। একবার ল্যাম্বডা একটি ভেরিয়েবলে বরাদ্দ করা হলে, আপনি এটিকে একটি ফাংশনের মতো কল করতে পারেন।

    REPL ( Tools > Kotlin > Kotlin REPL ) ব্যবহার করে, এই কোডটি ব্যবহার করে দেখুন:
var dirtyLevel = 20
val waterFilter = { dirty : Int -> dirty / 2}
println(waterFilter(dirtyLevel))
⇒ 10

এই উদাহরণে, ল্যাম্বডা dirty নামে একটি Int নেয় এবং dirty / 2 ফেরত দেয়। (কারণ ফিল্টারিং ময়লা অপসারণ করে।)

  1. ফাংশন প্রকারের জন্য কোটলিনের সিনট্যাক্স ল্যাম্বডাসের জন্য এর সিনট্যাক্সের সাথে ঘনিষ্ঠভাবে সম্পর্কিত। একটি ফাংশন ধারণ করে এমন একটি ভেরিয়েবল পরিষ্কারভাবে ঘোষণা করতে এই সিনট্যাক্সটি ব্যবহার করুন:
val waterFilter: (Int) -> Int = { dirty -> dirty / 2 }

কোডটি যা বলে তা এখানে:

  • waterFilter নামে একটি ভেরিয়েবল তৈরি করুন।
  • waterFilter যেকোন ফাংশন হতে পারে যা একটি Int নেয় এবং একটি Int প্রদান করে।
  • waterFilter একটি ল্যাম্বডা বরাদ্দ করুন।
  • ল্যাম্বডা 2 দ্বারা বিভক্ত dirty যুক্তির মান প্রদান করে।

মনে রাখবেন যে আপনাকে আর ল্যাম্বডা আর্গুমেন্টের ধরন নির্দিষ্ট করতে হবে না। প্রকার অনুমান দ্বারা টাইপ গণনা করা হয়.

ধাপ 2: একটি উচ্চ-অর্ডার ফাংশন তৈরি করুন

এখনও অবধি, ল্যাম্বডাসের উদাহরণগুলি বেশিরভাগ ফাংশনের মতো দেখায়। ল্যাম্বডাসের আসল শক্তি উচ্চ-ক্রম ফাংশন তৈরি করতে তাদের ব্যবহার করছে, যেখানে একটি ফাংশনের যুক্তি অন্য ফাংশন।

  1. একটি উচ্চ-ক্রম ফাংশন লিখুন। এখানে একটি মৌলিক উদাহরণ, একটি ফাংশন যা দুটি আর্গুমেন্ট নেয়। প্রথম যুক্তিটি একটি পূর্ণসংখ্যা। দ্বিতীয় আর্গুমেন্ট হল একটি ফাংশন যা একটি পূর্ণসংখ্যা নেয় এবং একটি পূর্ণসংখ্যা প্রদান করে। এটি REPL এ চেষ্টা করে দেখুন।
fun updateDirty(dirty: Int, operation: (Int) -> Int): Int {
   return operation(dirty)
}

কোডের বডি দ্বিতীয় আর্গুমেন্ট হিসাবে পাস করা ফাংশনটিকে কল করে এবং এটি বরাবর প্রথম আর্গুমেন্ট পাস করে।

  1. এই ফাংশন কল করতে, এটি একটি পূর্ণসংখ্যা এবং একটি ফাংশন পাস.
val waterFilter: (Int) -> Int = { dirty -> dirty / 2 }
println(updateDirty(30, waterFilter))
⇒ 15

আপনি যে ফাংশনটি পাস করেন সেটিকে ল্যাম্বডা হতে হবে না; এটি পরিবর্তে একটি নিয়মিত নামের ফাংশন হতে পারে। একটি নিয়মিত ফাংশন হিসাবে আর্গুমেন্ট নির্দিষ্ট করতে, :: অপারেটর ব্যবহার করুন। এইভাবে কোটলিন জানেন যে আপনি ফাংশন রেফারেন্সটি একটি যুক্তি হিসাবে পাস করছেন, ফাংশনটি কল করার চেষ্টা করছেন না।

  1. আপডেট করার জন্য একটি নিয়মিত নামের ফাংশন পাস করার চেষ্টা করুন updateDirty()
fun increaseDirty( start: Int ) = start + 1

println(updateDirty(15, ::increaseDirty))
⇒ 16
var dirtyLevel = 19;
dirtyLevel = updateDirty(dirtyLevel) { dirtyLevel -> dirtyLevel + 23}
println(dirtyLevel)
⇒ 42
  • IntelliJ IDEA-তে একটি Kotlin উৎস ফাইল তৈরি করতে, একটি Kotlin প্রকল্প দিয়ে শুরু করুন।
  • IntelliJ IDEA-তে একটি প্রোগ্রাম কম্পাইল এবং রান করতে, main() ফাংশনের পাশে সবুজ ত্রিভুজটিতে ক্লিক করুন। আউটপুট নীচের একটি লগ উইন্ডোতে প্রদর্শিত হবে.
  • IntelliJ IDEA-তে, Run > Edit Configurations-main() ফাংশনে পাস করতে কমান্ড লাইন আর্গুমেন্ট নির্দিষ্ট করুন।
  • কোটলিনের প্রায় সবকিছুরই একটা মূল্য আছে। আপনি যদি একটি অভিব্যক্তি বা রিটার্ন মান হিসাবে একটি if বা when এর মান ব্যবহার করে আপনার কোডটিকে আরও সংক্ষিপ্ত করতে এই সত্যটি ব্যবহার করতে পারেন।
  • ডিফল্ট আর্গুমেন্ট একটি ফাংশন বা পদ্ধতির একাধিক সংস্করণের প্রয়োজনীয়তা সরিয়ে দেয়। উদাহরণ স্বরূপ:
    fun swim(speed: String = "fast") { ... }
  • কমপ্যাক্ট ফাংশন, বা একক-অভিব্যক্তি ফাংশন, আপনার কোডকে আরও পাঠযোগ্য করে তুলতে পারে। উদাহরণ স্বরূপ:
    fun isTooHot(temperature: Int) = temperature > 30
  • আপনি ফিল্টার সম্পর্কে কিছু মৌলিক বিষয় শিখেছেন, যা ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে। উদাহরণ স্বরূপ:
    val beginsWithP = decorations.filter { it [0] == 'p' }
  • একটি ল্যাম্বডা এক্সপ্রেশন একটি অভিব্যক্তি যা একটি নামহীন ফাংশন করে। ল্যাম্বডা এক্সপ্রেশনগুলি কোঁকড়া ধনুর্বন্ধনীর মধ্যে সংজ্ঞায়িত করা হয়েছে {}
  • একটি উচ্চ-ক্রম ফাংশনে , আপনি একটি ফাংশন যেমন একটি ল্যাম্বডা এক্সপ্রেশন ডেটা হিসাবে অন্য ফাংশনে পাস করেন। উদাহরণ স্বরূপ:
    dirtyLevel = updateDirty(dirtyLevel) { dirtyLevel -> dirtyLevel + 23}

এই পাঠে অনেক কিছু আছে, বিশেষ করে যদি আপনি ল্যাম্বডাসে নতুন হন। একটি পরবর্তী পাঠ ল্যাম্বডাস এবং উচ্চ-ক্রম ফাংশনগুলিকে পুনরায় দেখায়।

কোটলিন ডকুমেন্টেশন

আপনি যদি এই কোর্সে কোনো বিষয়ে আরও তথ্য চান, বা আপনি যদি আটকে যান, https://kotlinlang.org আপনার সেরা শুরুর পয়েন্ট।

কোটলিন টিউটোরিয়াল

https://try.kotlinlang.org ওয়েবসাইটটিতে Kotlin Koans নামে সমৃদ্ধ টিউটোরিয়াল রয়েছে, একটি ওয়েব-ভিত্তিক দোভাষী , এবং উদাহরণ সহ রেফারেন্স ডকুমেন্টেশনের একটি সম্পূর্ণ সেট।

উদ্যতা কোর্স

এই বিষয়ে Udacity কোর্সটি দেখতে, প্রোগ্রামারদের জন্য Kotlin Bootcamp দেখুন।

ইন্টেলিজ আইডিয়া

IntelliJ IDEA-এর জন্য ডকুমেন্টেশন জেটব্রেইন্স ওয়েবসাইটে পাওয়া যাবে।

এই বিভাগে একজন প্রশিক্ষকের নেতৃত্বে একটি কোর্সের অংশ হিসাবে এই কোডল্যাবের মাধ্যমে কাজ করা শিক্ষার্থীদের জন্য সম্ভাব্য হোমওয়ার্ক অ্যাসাইনমেন্ট তালিকাভুক্ত করা হয়েছে। নিম্নলিখিতগুলি করা প্রশিক্ষকের উপর নির্ভর করে:

  • প্রয়োজনে হোমওয়ার্ক বরাদ্দ করুন।
  • শিক্ষার্থীদের সাথে যোগাযোগ করুন কিভাবে হোমওয়ার্ক অ্যাসাইনমেন্ট জমা দিতে হয়।
  • হোমওয়ার্ক অ্যাসাইনমেন্ট গ্রেড.

প্রশিক্ষকরা এই পরামর্শগুলি যতটা কম বা যতটা চান ততটা ব্যবহার করতে পারেন, এবং তাদের উপযুক্ত মনে করে অন্য কোনও হোমওয়ার্ক বরাদ্দ করতে নির্দ্বিধায় করা উচিত।

আপনি যদি এই কোডল্যাবের মাধ্যমে নিজে থেকে কাজ করে থাকেন, তাহলে আপনার জ্ঞান পরীক্ষা করার জন্য এই হোমওয়ার্ক অ্যাসাইনমেন্টগুলি ব্যবহার করুন।

এই প্রশ্নগুলোর উত্তর দাও

প্রশ্ন 1

স্ট্রিং element যে স্ট্রিংটিতে কল করা হয়েছে তার মধ্যে থাকলে contains(element: String) ফাংশনটি true হয়। নিচের কোডের আউটপুট কি হবে?

val decorations = listOf ("rock", "pagoda", "plastic plant", "alligator", "flowerpot")

println(decorations.filter {it.contains('p')})

[pagoda, plastic, plant]

[pagoda, plastic plant]

[pagoda, plastic plant, flowerpot]

[rock, alligator]

প্রশ্ন 2

নিম্নলিখিত ফাংশন সংজ্ঞায়, কোন প্যারামিটারের প্রয়োজন?
fun shouldChangeWater (day: String, temperature: Int = 22, dirty: Int = 20, numDecorations: Int = 0): Boolean {...}

numDecorations

dirty

day

temperature

প্রশ্ন 3

আপনি একটি নিয়মিত নামের ফাংশন (এটি কল করার ফলাফল নয়) অন্য ফাংশনে পাস করতে পারেন। কিভাবে আপনি বৃদ্ধিডার্টি (স্টার্ট: ইন্টি increaseDirty( start: Int ) = start + 1 আপডেট করতে পাস করবেন updateDirty(dirty: Int, operation: (Int) -> Int) ?

updateDirty(15, &increaseDirty())

▢ আপডেট updateDirty(15, increaseDirty())

updateDirty(15, ("increaseDirty()"))

updateDirty(15, ::increaseDirty)

পরবর্তী পাঠে এগিয়ে যান: 4. ক্লাস এবং অবজেক্ট

অন্যান্য কোডল্যাবগুলির লিঙ্ক সহ কোর্সের একটি ওভারভিউয়ের জন্য, "প্রোগ্রামারদের জন্য কোটলিন বুটক্যাম্প: কোর্সে স্বাগতম" দেখুন।