Runnable
Interfejs zawiera metodę void run()
. W klasie implementującej ten interfejs musimy zaimplementować metodę run()
, najczęściej tworząc klasę anonimową:
Zamiast kodu:
SwingUtilities.invokeLater(new Runnable(){ @Override public void run() { new Test(new ButtonPanel()); } });
możemy zastosować kod:
SwingUtilities.invokeLater(() -> new Test(new ButtonPanel()));
Metoda invokeLater()
oczekuje obiektu klasy implementującej Runnable
, w związku z czym kompilator wie, że puste nawiasy ()
odnoszą się do metody run()
interfejsu Runnable
.
Wyrażenie lambda zawiera puste nawiasy ()
ponieważ metoda run()
również nie przyjmuje żadnych argumentów.
Metoda run nie zwraca żadnego typu, ale wywołuje konstruktor klasy Test , który wywołuje konstruktor klasy ButtonPanel
.
Wyrażenie lambda nie zwraca nic ponieważ metoda run()
nie zwraca nic.
ActionListener
Metoda addActionListener()
wymaga jako argumentu obiektu klasy implementującej interfejs ActionListener
. Implementacja tej klasy musi konkretyzować metodę void actionPerformed(ActionEvent e)
, przyjmującą jako argument obiekt klasy ActionEvent
.
Normalnie tworzymy klasę anonimową:
button.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { button.setText("Kliknij jeszcze raz!"); } });
Obecnie możemy użyć wyrażenia lambda:
button.addActionListener(event -> button.setText("Kliknij jeszcze raz"));
Kompilator wie, że musi powstać obiekt klasy implementującej interfejs ActionListener
, a więc wiadomo, że należy użyć metody actionPerformed
, co oznacza, że jedyny argument event
jest obiektem klasy ActionEvent
.
Wyrażenie lambda nie zwraca żadnego typu, bo metoda actionPerformed
nic nie zwraca, ale wywołana zostaje metoda setText()
obiektu button
.
PropertyChangeListener
Czasami implementowana metoda interfejsu wymaga większej ilości kodu niż jedna linijka. jak wtedy wygląda wyrażenie lambda?
Interfejs PropertyChangeListener
pozwala na śledzenie zmian wartości pól w obiektach.
smok.addPropertyChangeListener(new PropertyChangeListener(){ @Override public void propertyChange(PropertyChangeEvent evt) { Integer newValue = (Integer)evt.getNewValue(); System.out.println(newValue); } });
Zamiennie możemy użyć wyrażenia lambda:
smok.addPropertyChangeListener(evt -> { Integer newValue = (Integer)evt.getNewValue(); System.out.println(newValue); });
VetoableChangeListener
smok.addVetoableChangeListener(new VetoableChangeListener(){ @Override public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException { Integer newVal = (Integer)evt.getNewValue(); int val = newVal.intValue(); if(val < min){ throw new PropertyVetoException( "Stop. Smok zaraz umrze z głodu", evt); } if(val > max){ throw new PropertyVetoException( "Stop. Smok zaraz pęknie z przejedzenia", evt); } } });
I to samo z użyciem wyrażenia lambda:
smok.addVetoableChangeListener(evt -> { Integer newVal = (Integer)evt.getNewValue(); int val = newVal.intValue(); if(val < min){ throw new PropertyVetoException( "Stop. Smok zaraz umrze z głodu", evt); } if(val > max){ throw new PropertyVetoException( "Stop. Smok zaraz pęknie z przejedzenia", evt); } });
Comparator
Comparator<Smoklon> comp1 = new Comparator<>(){ @Override public int compare(Smoklon o1, Smoklon o2) { return (o1.getDywizja()).compareTo(o2.getDywizja()); } }; Collections.sort(list, comp1);
Możemy też użyć wyrażenia lambda:
Comparator<Smoklon> comp2 = (o1, o2) -> (o1.getDywizja()).compareTo(o2.getDywizja()); Collections.sort(list, comp2);
Możemy również podstawić wyrażenie lambda bezpośrednio do metody sort()
.
Collections.sort(list, (o1, o2) -> (o1.getDywizja()).compareTo(o2.getDywizja()));