Java lambda ifodalari


ULASHISH

Java lambda ifodalari

Lambda ifodalari Java 8 versiyasida qo‘shilgan.

Lambda ifodasi — parametrlarni qabul qilib, qiymat qaytaradigan qisqa kod bloki. Lambdalar metodlarga o‘xshaydi, lekin ularga nom kerak emas va ularni to‘g‘ridan-to‘g‘ri metod tanasi ichida yozish mumkin.


Sintaksis

Eng oddiy lambda ifodasi bitta parametr va bitta ifodadan iborat bo‘ladi:

parameter -> expression

Bir nechta parametrdan foydalanish uchun ularni qavs ichiga oling:

(parameter1, parameter2) -> expression

Oddiy ifodalar darhol qiymat qaytarishi kerak. Ular sikllar yoki if shartlari kabi bir nechta ko‘rsatmani (statement) o‘z ichiga ola olmaydi. Murakkabroq ishlarni bajarish uchun jingalak qavslar ichidagi kod blokidan foydalaning. Agar lambda qiymat qaytarishi kerak bo‘lsa, return kalit so‘zidan foydalaning:

(parameter1, parameter2) -> {
  // code block
  return result;
}

Lambda ifodalaridan foydalanish

Lambdalar ko‘pincha metodlarga argument sifatida uzatiladi. Masalan, lambdani ArrayList obyektining forEach() metodida ishlatishingiz mumkin:

Misol

import java.util.ArrayList;

public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    numbers.add(5);
    numbers.add(9);
    numbers.add(8);
    numbers.add(1);
    numbers.forEach((n) -> { System.out.println(n); });
  }
}

O‘zingiz sinab ko‘ring »



O‘zgaruvchilardagi lambdalar

Lambda ifodasini o‘zgaruvchida saqlash mumkin. O‘zgaruvchining tipi aynan bitta metodga ega interfeys (funksional interfeys) bo‘lishi kerak. Lambda shu metodning parametrlari va qaytarish tipiga mos kelishi shart.

Java ko‘plab o‘rnatilgan funksional interfeyslarni o‘z ichiga oladi, masalan, ro‘yxatlar bilan ishlatiladigan Consumer (java.util paketidan).

Misol

import java.util.ArrayList;
import java.util.function.Consumer;

public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    numbers.add(5);
    numbers.add(9);
    numbers.add(8);
    numbers.add(1);
    
    Consumer<Integer> method = (n) -> { System.out.println(n); };
    numbers.forEach(method);
  }
}

O‘zingiz sinab ko‘ring »


Lambdalar metod parametrlari sifatida

Lambda ifodasini metodga ham uzatishingiz mumkin. Metodning parametri funksional interfeys bo‘lishi kerak. Shunda interfeys metodini chaqirish lambda ifodasini ishga tushiradi:

Misol

interface StringFunction {
  String run(String str);
}

public class Main {
  public static void main(String[] args) {
    StringFunction exclaim = (s) -> s + "!";
    StringFunction ask = (s) -> s + "?";
    printFormatted("Hello", exclaim);
    printFormatted("Hello", ask);
  }

  public static void printFormatted(String str, StringFunction format) {
    String result = format.run(str);
    System.out.println(result);
  }
}

O‘zingiz sinab ko‘ring »


Anonim sinf va lambda ifodasi

Java 8+ versiyalarida anonim sinfni ko‘pincha lambda ifodasi bilan almashtirish mumkin — lekin faqat interfeys funksional interfeys (bitta abstrakt metodli) bo‘lsa.

Misol: bitta vazifa, ikki usul (bitta metodli interfeys):
Anonim sinf
// Functional interface (one abstract method)
interface Greeting {
  void sayHello();
}

public class Main {
  public static void main(String[] args) {
    Greeting g = new Greeting() {
      public void sayHello() {
        System.out.println("Hello from anonymous class");
      }
    }; 
    g.sayHello();
  }
}

O‘zingiz sinab ko‘ring »

Lambda ifodasi
// Same functional interface
interface Greeting {
  void sayHello();
}

public class Main {
  public static void main(String[] args) {
    Greeting g = () -> System.out.println("Hello from lambda");
    g.sayHello();
  }
}

O‘zingiz sinab ko‘ring »

Amaliy qoida: Qisqa, bitta metodli interfeyslar uchun lambda ifodasidan foydalaning. Bir nechta metodni qayta aniqlash, maydonlar qo‘shish yoki sinfdan meros olish kerak bo‘lganda anonim sinfdan foydalaning.




W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!