2014-12-17 10 views
22

Ist es möglich, ein Verfahren, in einem Verbraucher, wie ein Verfahren Bezug zu laufen, aber auf dem Objekt an die Verbraucher weitergegeben:„Good“ Methode Methode für jedes Objekt API-Stream zu nennen

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

würde sein etwas wie:

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

aber das ist nicht funktioniert ...

gibt es eine Möglichkeit, mit der Methode Referenzen, oder ist x -> x.method() die einzige Möglichkeit, hier zu arbeiten?

Antwort

32

Sie brauchen nicht this. YourClassName::close die close Methode auf dem an den Verbraucher weitergegeben Objekt aufrufen:

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

Es gibt vier Arten von Verfahren Referenzen sind (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 

In Ihrem Fall müssen Sie die dritte Art.

+0

Thank you! Verpasste diese "dritte Art";) – Jofkos

+0

@Jofkos: Soweit ich in meinem "Real-Life-Code" sehen kann, ist diese dritte Art die wichtigste. Es gibt einfach so viele bereits existierende Methoden, die die richtige Signatur für 'map',' filter' oder 'forEach' haben ... – Holger

+0

@Holger yeah, ich habe gerade erst angefangen, die neuen Java 8 Dinge zu benutzen. Also wird alter Code in die neue Syntax übertragen, einige neue werden geschrieben, aber dies ist das erste Mal, dass ich diese "dritte Art" brauche;) – Jofkos

10

Ich nehme an, es sein sollte:

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

bereitgestellt, um die log.getHandlers() gibt einen Array von Objekten des Typs Handler.

6

Sicher, aber Sie müssen die korrekte Syntax von method reference, das heißt verwenden, um die Klasse übergeben, auf die die close() Methode gehören:

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