web-dev-qa-db-fra.com

"Bonne" méthode pour appeler la méthode sur chaque objet à l'aide de l'API Stream

Est-il possible d'exécuter une méthode, dans un consommateur, comme une référence de méthode, mais sur l'objet passé au consommateur:

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

serait une chose comme:

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

mais ça ne marche pas ...

Y a-t-il une possibilité avec des références de méthode, ou est-ce que x -> x.method() est la seule façon de travailler ici?

23
Jofkos

Vous n'avez pas besoin de this. YourClassName::close appellera la méthode close sur l'objet passé au consommateur:

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

Il existe quatre types de références de méthode ( 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

Dans votre cas, vous avez besoin du troisième type.

34
Eran

Je suppose que ça devrait être:

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

À condition que la log.getHandlers() renvoie un tableau d'objets de type Handler.

12
Edwin Dalorzo

Bien sûr, mais vous devez utiliser la syntaxe correcte de référence de méthode , c'est-à-dire passer la classe à laquelle appartient la méthode close():

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