Is it possible to run a method, in a consumer, like a method reference, but on the object passed to the consumer:
Arrays.stream(log.getHandlers()).forEach(h -> h.close());
would be a thing like:
Arrays.stream(log.getHandlers()).forEach(this::close);
but that's not working...
Is there a possibility with method references, or is x -> x.method() the only way working here?
Java Stream forEach() method is used to iterate over all the elements of the given Stream and to perform an Consumer action on each element of the Stream.
Some of the most prominent methods used in these examples are the filter() - which allows elements that match the predicate, count() - which counts the number of items in a stream, map() - which applies a function in each element of Stream for transformation, and collect() - which collects the final result of Stream ...
Original pre-Java 8 answer: List<Car> cars = //... Function<Car, String> carsToNames = new Function<Car, String>() { @Override public String apply(Car car) { return car. getName(); } } List<String> names = Lists. transform(cars, carsToNames);
The filter() method allows us to pick a stream of elements that satisfy a predicate.
You don't need this. YourClassName::close will call the close method on the object passed to the consumer :
Arrays.stream(log.getHandlers()).forEach(YourClassName::close);
There are four kinds of method references (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 your case, you need the third kind.
I suppose it should be:
Arrays.stream(log.getHandlers()).forEach(Handler::close);
Provided the log.getHandlers() returns an array of objects of type Handler.
Sure, but you must use the correct syntax of method reference, i.e. pass the class to which the close() method belong:
Arrays.stream(log.getHandlers()).forEach(Handler::close);
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With