2014-12-17 11 views
22

Czy to możliwe, aby uruchomić metodę, w konsumenta, jak odniesienie metoda, ale na obiekcie na konsumenta:wywołać metody na każdy obiekt przy użyciu Stream API

Arrays.stream(log.getHandlers()).forEach(h -> h.close()); 

będzie być coś takiego:

Arrays.stream(log.getHandlers()).forEach(this::close); 

ale to nie działa ...

Czy istnieje możliwość odniesieniami metodzie lub jest x -> x.method() jedynym sposobem pracy tutaj?

Odpowiedz

32

Nie potrzebujesz this. YourClassName::close wywoła metodę close na obiekcie na konsumenta:

Arrays.stream(log.getHandlers()).forEach(YourClassName::close); 

Istnieją cztery rodzaje odniesień metodą (Source)

Kind                   Example 
----                   ------- 
Reference to a static method             ContainingClass::staticMethodName 
Reference to an instance method of a particular object      containingObject::instanceMethodName 
Reference to an instance method of an arbitrary object of a particular type ContainingType::methodName 
Reference to a constructor             ClassName::new 

W twoim przypadku trzeba trzeciego stopnia.

+0

Dziękujemy! Tęskniłem za tym "trzecim rodzajem";) – Jofkos

+0

@Jofkos: o ile widzę w moim "prawdziwym kodzie", ten trzeci rodzaj jest najważniejszy. Istnieje tylko wiele istniejących metod mających odpowiedni podpis dla 'map',' filter' lub 'forEach' ... – Holger

+0

@Holger tak, właśnie zaczynam używać nowych rzeczy java 8 kilka razy temu. Tak więc stary kod jest przenoszony do nowej składni, niektóre nowe są pisane, ale po raz pierwszy potrzebowałem tego "trzeciego rodzaju";) – Jofkos

10

Przypuszczam, powinno być:

Arrays.stream(log.getHandlers()).forEach(Handler::close); 

dostarczyła log.getHandlers() zwraca tablicę obiektów typu Handler.

6

Jasne, ale trzeba użyć poprawnej składni method reference, to znaczy zdać klasę, do której metoda close() należą:

Arrays.stream(log.getHandlers()).forEach(Handler::close); 
Powiązane problemy