Sobes.tech
Middle

Mis on lambdaavaldised Java-s ja milliseid võimalusi need pakuvad?

sobes.tech AI

Vastus AI-lt

Lambdaväljendid Java on lühike süntaks anonüümsete funktsioonide (nimeta meetodite) loomiseks, mida saab edasi anda argumentidena või salvestada muutujatesse. Põhimõtteliselt on need "elus" realiseeritud funktsionaalsed liidesed.

Peamised võimalused, mida lambdaväljendid pakuvad:

  • Süntaksi lihtsustamine: Oluliselt lühendavad boilerplate-koodi, töötades funktsionaalsete liideste with, võrreldes anonüümsete sisemiste klassidega.

    // Enne lambda:
    Runnable classicRunnable = new Runnable() {
        @Override
        public void run() {
            System.out.println("Klassikaline Runnable");
        }
    };
    
    // Lambda-ga:
    Runnable lambdaRunnable = () -> System.out.println("Lambda Runnable");
    
  • Funktsionaalne programmeerimine: Võimaldavad kirjutada rohkem funktsionaalset koodi, kus funktsioonid on esimese klassi kodanikud ja neid saab edastada andmetena. See on oluline Stream API-ga töötamisel.

    // Filtreerimine lambda abil
    List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
    List<String> filteredNames = names.stream()
                                     .filter(name -> name.startsWith("A"))
                                     .collect(Collectors.toList());
    
  • Töö Stream API-ga: Lambdaväljendid on aluseks enamikule Stream API operatsioonidele (filter, map, forEach, reduce jne), pakkudes lühemust ja paralleelset täitmist.

    // Elementide teisendamine ja väljatrükk
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    numbers.stream()
           .map(n -> n * n) // lambda map-ile
           .forEach(System.out::println); // meetodi viide (lambda alternatiiv)
    
  • Paranenud loetavus: Lihtsate operatsioonide jaoks muudab lambda koodi selgemaks ja arusaadavamaks, keskendudes operatsiooni enda rõhutamisele, mitte anonüümse klassi süntaksile.

  • Funktsionaalsete liideste rakendamine: Neid saab kasutada igal pool, kus oodatakse funktsionaalset liidest (liides ühe abstraktse meetodiga).

Lambda väljendi süntaks: (parameetrid) -> { keha }

Näited:

  • Ilma parameetriteta, ilma tagastusarvuta: () -> System.out.println("Hello")
  • Ühe parameetriga, ilma tagastusarvuta: name -> System.out.println("Hello, " + name) (võib jätta sulgude ümber ühe parameetri)
  • Mitme parameetriga, ilma tagastusarvuta: (x, y) -> System.out.println(x + y)
  • Parameetritega, tagastusarvuga: (a, b) -> a + b (kui keha koosneb ühest väljendusest, tagastatakse selle väärtus automaatselt)
  • Parameetritega, plokiga ja tagastusarvuga: (a, b) -> { int sum = a + b; return sum; } (selge return on vajalik plokkidele)