Expresii lambda

Introducere

Unul dintre cele mai importante concepte introduse de Java 8 este cel al expresiilor functionale. Acestea deschid calea catre posiblitatea implementarii conceptelor de programare functionala in java.

O expresie lambda este o secventa de cod care poate fi transmisa pentru executie imediat sau la un moment ulterior de timp.

In continuare vor fi prezentate cateva cazuri tipice de utilizare a expresiilor lambda.

Cazul 1

Pentru a executa in cadrul unui fir de executie o secventa de actiuni, construim o clasa ce implementeaza interfata Runnable.

class Worker implements Runnable {
    public void run() {
        System.out.println("Do something ...");
    }
}

Ulterior, in momentul in care dorim sa executam secventa de cod de mai sus pe un fir de executie vom construi un obiect de tip Thread si ii vom transmite un obiect de tip Worker.

 Thread t1 = new Thread(new Worker());
 t1.start();

Prin utilizarea expresiilor lambda codul din exemplu anterior poate fi redus la:

        Runnable r = () -> System.out.println("Do something else ...");
        new Thread(r).start();

sau

        new Thread(()-> System.out.println("Do something new ...")).start();

Cazul 2

O alta situatie este cea in care dorim sa efectuam o operatie de sortare folosind un comparator propriu. In acest context vom folosi interfata Comparator ca in exemplul de mai jos:

class LengthComparator implements Comparator<String> {
     public int compare(String first, String second) {
        return Integer.compare(first.length(), second.length());
     }
  }
 
...   
String words[] = {"hjgsd","sg","qytrwye","iuaslkdmoa","g"};
Arrays.sort(words, new LengthComparator());
...

Folosind expresii lmabda fom putea defini comparatorul sub forma:

        Comparator<String> comp
                = (first,second) -> Integer.compare(first.length(),second.length());

iar utilizarea comparatorului se va face astfel:

Arrays.sort(words, comp);

Condensat vom putea scrie secventa de mai sus:

Arrays.sort(words,(first,second) -> Integer.compare(first.length(),second.length()));

Cazul 3

Interceptarea evenimentului de click pe buton si executia unei actiune se poate implementa astfel:

class UI1 extends JFrame {
    JButton b = new JButton("OK");
    UI1() {
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                System.out.println("Thanks for clicking!");
            }
        });
        this.getContentPane().add(b);
        setSize(200, 200);
        setVisible(true);
    }
}

Interceptorul de evenimente de tip ActionListener instantiat in exemplul de mai sus sub forma unei clase interne anonime poate fi rescris utilizand expresii lambda astfel:

class UI2 extends JFrame {
    JButton b = new JButton("OK");
    UI2() {
        b.addActionListener(event -> System.out.println("Thanks for clicking!"));
        this.getContentPane().add(b);
        setSize(200, 200);
        setVisible(true);
    }
}