View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.lang3;
18  
19  import java.io.IOException;
20  import java.io.UncheckedIOException;
21  import java.lang.reflect.UndeclaredThrowableException;
22  import java.util.Arrays;
23  import java.util.Collection;
24  import java.util.Objects;
25  import java.util.concurrent.Callable;
26  import java.util.function.BiConsumer;
27  import java.util.function.BiFunction;
28  import java.util.function.BiPredicate;
29  import java.util.function.Consumer;
30  import java.util.function.Function;
31  import java.util.function.Predicate;
32  import java.util.function.Supplier;
33  import java.util.stream.Stream;
34  
35  import org.apache.commons.lang3.Streams.FailableStream;
36  import org.apache.commons.lang3.exception.ExceptionUtils;
37  import org.apache.commons.lang3.function.Failable;
38  import org.apache.commons.lang3.function.FailableBooleanSupplier;
39  
40  /**
41   * This class provides utility functions, and classes for working with the {@code java.util.function} package, or more
42   * generally, with Java 8 lambdas. More specifically, it attempts to address the fact that lambdas are supposed not to
43   * throw Exceptions, at least not checked Exceptions, AKA instances of {@link Exception}. This enforces the use of
44   * constructs like:
45   *
46   * <pre>
47   * {@code
48   *     Consumer<java.lang.reflect.Method> consumer = m -> {
49   *         try {
50   *             m.invoke(o, args);
51   *         } catch (Throwable t) {
52   *             throw Functions.rethrow(t);
53   *         }
54   *     };
55   * }</pre>
56   *
57   * <p>
58   * By replacing a {@link java.util.function.Consumer Consumer&lt;O&gt;} with a {@link FailableConsumer
59   * FailableConsumer&lt;O,? extends Throwable&gt;}, this can be written like follows:
60   * </p>
61   *
62   * <pre>
63   * {@code
64   *   Functions.accept((m) -> m.invoke(o,args));
65   * }</pre>
66   *
67   * <p>
68   * Obviously, the second version is much more concise and the spirit of Lambda expressions is met better than the second
69   * version.
70   * </p>
71   *
72   * @since 3.9
73   * @deprecated Use {@link org.apache.commons.lang3.function.Failable}.
74   */
75  @Deprecated
76  public class Functions {
77  
78      /**
79       * A functional interface like {@link BiConsumer} that declares a {@link Throwable}.
80       *
81       * <p>
82       * TODO for 4.0: Move to org.apache.commons.lang3.function.
83       * </p>
84       *
85       * @param <O1> Consumed type 1.
86       * @param <O2> Consumed type 2.
87       * @param <T> Thrown exception.
88       * @deprecated Use {@link org.apache.commons.lang3.function.FailableBiConsumer}.
89       */
90      @Deprecated
91      @FunctionalInterface
92      public interface FailableBiConsumer<O1, O2, T extends Throwable> {
93  
94          /**
95           * Accepts the consumer.
96           *
97           * @param object1 The first parameter for the consumable to accept
98           * @param object2 The second parameter for the consumable to accept
99           * @throws T Thrown when the consumer fails.
100          */
101         void accept(O1 object1, O2 object2) throws T;
102     }
103 
104     /**
105      * A functional interface like {@link BiFunction} that declares a {@link Throwable}.
106      *
107      * <p>
108      * TODO for 4.0: Move to org.apache.commons.lang3.function.
109      * </p>
110      *
111      * @param <O1> Input type 1.
112      * @param <O2> Input type 2.
113      * @param <R> Return type.
114      * @param <T> Thrown exception.
115      * @deprecated Use {@link org.apache.commons.lang3.function.FailableBiFunction}.
116      */
117     @Deprecated
118     @FunctionalInterface
119     public interface FailableBiFunction<O1, O2, R, T extends Throwable> {
120 
121         /**
122          * Applies this function.
123          *
124          * @param input1 The first input for the function
125          * @param input2 The second input for the function
126          * @return The result of the function
127          * @throws T Thrown when the function fails.
128          */
129         R apply(O1 input1, O2 input2) throws T;
130     }
131 
132     /**
133      * A functional interface like {@link BiPredicate} that declares a {@link Throwable}.
134      *
135      * <p>
136      * TODO for 4.0: Move to org.apache.commons.lang3.function.
137      * </p>
138      *
139      * @param <O1> Predicate type 1.
140      * @param <O2> Predicate type 2.
141      * @param <T> Thrown exception.
142      * @deprecated Use {@link org.apache.commons.lang3.function.FailableBiPredicate}.
143      */
144     @Deprecated
145     @FunctionalInterface
146     public interface FailableBiPredicate<O1, O2, T extends Throwable> {
147 
148         /**
149          * Tests the predicate.
150          *
151          * @param object1 The first object to test the predicate on
152          * @param object2 The second object to test the predicate on
153          * @return The predicate's evaluation
154          * @throws T Thrown if the predicate fails.
155          */
156         boolean test(O1 object1, O2 object2) throws T;
157     }
158 
159     /**
160      * A functional interface like {@link java.util.concurrent.Callable} that declares a {@link Throwable}.
161      *
162      * <p>
163      * TODO for 4.0: Move to org.apache.commons.lang3.function.
164      * </p>
165      *
166      * @param <R> Return type.
167      * @param <T> Thrown exception.
168      * @deprecated Use {@link org.apache.commons.lang3.function.FailableCallable}.
169      */
170     @Deprecated
171     @FunctionalInterface
172     public interface FailableCallable<R, T extends Throwable> {
173 
174         /**
175          * Calls the callable.
176          *
177          * @return The value returned from the callable
178          * @throws T Thrown if the callable fails.
179          */
180         R call() throws T;
181     }
182 
183     /**
184      * A functional interface like {@link Consumer} that declares a {@link Throwable}.
185      *
186      * <p>
187      * TODO for 4.0: Move to org.apache.commons.lang3.function.
188      * </p>
189      *
190      * @param <O> Consumed type 1.
191      * @param <T> Thrown exception.
192      * @deprecated Use {@link org.apache.commons.lang3.function.FailableConsumer}.
193      */
194     @Deprecated
195     @FunctionalInterface
196     public interface FailableConsumer<O, T extends Throwable> {
197 
198         /**
199          * Accepts the consumer.
200          *
201          * @param object The parameter for the consumable to accept
202          * @throws T Thrown when the consumer fails.
203          */
204         void accept(O object) throws T;
205     }
206 
207     /**
208      * A functional interface like {@link Function} that declares a {@link Throwable}.
209      *
210      * <p>
211      * TODO for 4.0: Move to org.apache.commons.lang3.function.
212      * </p>
213      *
214      * @param <I> Input type 1.
215      * @param <R> Return type.
216      * @param <T> Thrown exception.
217      * @deprecated Use {@link org.apache.commons.lang3.function.FailableFunction}.
218      */
219     @Deprecated
220     @FunctionalInterface
221     public interface FailableFunction<I, R, T extends Throwable> {
222 
223         /**
224          * Applies this function.
225          *
226          * @param input The input for the function
227          * @return The result of the function
228          * @throws T Thrown when the function fails.
229          */
230         R apply(I input) throws T;
231     }
232 
233     /**
234      * A functional interface like {@link Predicate} that declares a {@link Throwable}.
235      *
236      * <p>
237      * TODO for 4.0: Move to org.apache.commons.lang3.function.
238      * </p>
239      *
240      * @param <I> Predicate type 1.
241      * @param <T> Thrown exception.
242      * @deprecated Use {@link org.apache.commons.lang3.function.FailablePredicate}.
243      */
244     @Deprecated
245     @FunctionalInterface
246     public interface FailablePredicate<I, T extends Throwable> {
247 
248         /**
249          * Tests the predicate.
250          *
251          * @param object The object to test the predicate on
252          * @return The predicate's evaluation
253          * @throws T Thrown if the predicate fails.
254          */
255         boolean test(I object) throws T;
256     }
257 
258     /**
259      * A functional interface like {@link Runnable} that declares a {@link Throwable}.
260      *
261      * <p>
262      * TODO for 4.0: Move to org.apache.commons.lang3.function.
263      * </p>
264      *
265      * @param <T> Thrown exception.
266      * @deprecated Use {@link org.apache.commons.lang3.function.FailableRunnable}.
267      */
268     @Deprecated
269     @FunctionalInterface
270     public interface FailableRunnable<T extends Throwable> {
271 
272         /**
273          * Runs the function.
274          *
275          * @throws T Thrown when the function fails.
276          */
277         void run() throws T;
278     }
279 
280     /**
281      * A functional interface like {@link Supplier} that declares a {@link Throwable}.
282      *
283      * <p>
284      * TODO for 4.0: Move to org.apache.commons.lang3.function.
285      * </p>
286      *
287      * @param <R> Return type.
288      * @param <T> Thrown exception.
289      * @deprecated Use {@link org.apache.commons.lang3.function.FailableSupplier}.
290      */
291     @Deprecated
292     @FunctionalInterface
293     public interface FailableSupplier<R, T extends Throwable> {
294 
295         /**
296          * Gets an object.
297          *
298          * @return A result
299          * @throws T Thrown if the supplier fails.
300          */
301         R get() throws T;
302     }
303 
304     /**
305      * Consumes a consumer and rethrows any exception as a {@link RuntimeException}.
306      *
307      * @param consumer The consumer to consume
308      * @param object1 The first object to consume by {@code consumer}
309      * @param object2 The second object to consume by {@code consumer}
310      * @param <O1> the type of the first argument the consumer accepts
311      * @param <O2> the type of the second argument the consumer accepts
312      * @param <T> The type of checked exception the consumer may throw
313      */
314     public static <O1, O2, T extends Throwable> void accept(final FailableBiConsumer<O1, O2, T> consumer,
315         final O1 object1, final O2 object2) {
316         run(() -> consumer.accept(object1, object2));
317     }
318 
319     /**
320      * Consumes a consumer and rethrows any exception as a {@link RuntimeException}.
321      *
322      * @param consumer The consumer to consume
323      * @param object The object to consume by {@code consumer}
324      * @param <O> The type the consumer accepts
325      * @param <T> The type of checked exception the consumer may throw
326      */
327     public static <O, T extends Throwable> void accept(final FailableConsumer<O, T> consumer, final O object) {
328         run(() -> consumer.accept(object));
329     }
330 
331     /**
332      * Applies a function and rethrows any exception as a {@link RuntimeException}.
333      *
334      * @param function The function to apply
335      * @param input1 The first input to apply {@code function} on
336      * @param input2 The second input to apply {@code function} on
337      * @param <O1> the type of the first argument the function accepts
338      * @param <O2> the type of the second argument the function accepts
339      * @param <O> The return type of the function
340      * @param <T> The type of checked exception the function may throw
341      * @return The value returned from the function
342      */
343     public static <O1, O2, O, T extends Throwable> O apply(final FailableBiFunction<O1, O2, O, T> function,
344         final O1 input1, final O2 input2) {
345         return get(() -> function.apply(input1, input2));
346     }
347 
348     /**
349      * Applies a function and rethrows any exception as a {@link RuntimeException}.
350      *
351      * @param function The function to apply
352      * @param input The input to apply {@code function} on
353      * @param <I> The type of the argument the function accepts
354      * @param <O> The return type of the function
355      * @param <T> The type of checked exception the function may throw
356      * @return The value returned from the function
357      */
358     public static <I, O, T extends Throwable> O apply(final FailableFunction<I, O, T> function, final I input) {
359         return get(() -> function.apply(input));
360     }
361 
362     /**
363      * Converts the given {@link FailableBiConsumer} into a standard {@link BiConsumer}.
364      *
365      * @param <O1> the type of the first argument of the consumers
366      * @param <O2> the type of the second argument of the consumers
367      * @param consumer A failable {@link BiConsumer}
368      * @return A standard {@link BiConsumer}
369      * @since 3.10
370      */
371     public static <O1, O2> BiConsumer<O1, O2> asBiConsumer(final FailableBiConsumer<O1, O2, ?> consumer) {
372         return (input1, input2) -> accept(consumer, input1, input2);
373     }
374 
375     /**
376      * Converts the given {@link FailableBiFunction} into a standard {@link BiFunction}.
377      *
378      * @param <O1> the type of the first argument of the input of the functions
379      * @param <O2> the type of the second argument of the input of the functions
380      * @param <O> The type of the output of the functions
381      * @param function A {@link FailableBiFunction}
382      * @return A standard {@link BiFunction}
383      * @since 3.10
384      */
385     public static <O1, O2, O> BiFunction<O1, O2, O> asBiFunction(final FailableBiFunction<O1, O2, O, ?> function) {
386         return (input1, input2) -> apply(function, input1, input2);
387     }
388 
389     /**
390      * Converts the given {@link FailableBiPredicate} into a standard {@link BiPredicate}.
391      *
392      * @param <O1> the type of the first argument used by the predicates
393      * @param <O2> the type of the second argument used by the predicates
394      * @param predicate A {@link FailableBiPredicate}
395      * @return A standard {@link BiPredicate}
396      * @since 3.10
397      */
398     public static <O1, O2> BiPredicate<O1, O2> asBiPredicate(final FailableBiPredicate<O1, O2, ?> predicate) {
399         return (input1, input2) -> test(predicate, input1, input2);
400     }
401 
402     /**
403      * Converts the given {@link FailableCallable} into a standard {@link Callable}.
404      *
405      * @param <O> The type used by the callables
406      * @param callable A {@link FailableCallable}
407      * @return A standard {@link Callable}
408      * @since 3.10
409      */
410     public static <O> Callable<O> asCallable(final FailableCallable<O, ?> callable) {
411         return () -> call(callable);
412     }
413 
414     /**
415      * Converts the given {@link FailableConsumer} into a standard {@link Consumer}.
416      *
417      * @param <I> The type used by the consumers
418      * @param consumer A {@link FailableConsumer}
419      * @return A standard {@link Consumer}
420      * @since 3.10
421      */
422     public static <I> Consumer<I> asConsumer(final FailableConsumer<I, ?> consumer) {
423         return input -> accept(consumer, input);
424     }
425 
426     /**
427      * Converts the given {@link FailableFunction} into a standard {@link Function}.
428      *
429      * @param <I> The type of the input of the functions
430      * @param <O> The type of the output of the functions
431      * @param function A {code FailableFunction}
432      * @return A standard {@link Function}
433      * @since 3.10
434      */
435     public static <I, O> Function<I, O> asFunction(final FailableFunction<I, O, ?> function) {
436         return input -> apply(function, input);
437     }
438 
439     /**
440      * Converts the given {@link FailablePredicate} into a standard {@link Predicate}.
441      *
442      * @param <I> The type used by the predicates
443      * @param predicate A {@link FailablePredicate}
444      * @return A standard {@link Predicate}
445      * @since 3.10
446      */
447     public static <I> Predicate<I> asPredicate(final FailablePredicate<I, ?> predicate) {
448         return input -> test(predicate, input);
449     }
450 
451     /**
452      * Converts the given {@link FailableRunnable} into a standard {@link Runnable}.
453      *
454      * @param runnable A {@link FailableRunnable}
455      * @return A standard {@link Runnable}
456      * @since 3.10
457      */
458     public static Runnable asRunnable(final FailableRunnable<?> runnable) {
459         return () -> run(runnable);
460     }
461 
462     /**
463      * Converts the given {@link FailableSupplier} into a standard {@link Supplier}.
464      *
465      * @param <O> The type supplied by the suppliers
466      * @param supplier A {@link FailableSupplier}
467      * @return A standard {@link Supplier}
468      * @since 3.10
469      */
470     public static <O> Supplier<O> asSupplier(final FailableSupplier<O, ?> supplier) {
471         return () -> get(supplier);
472     }
473 
474     /**
475      * Calls a callable and rethrows any exception as a {@link RuntimeException}.
476      *
477      * @param callable The callable to call
478      * @param <O> The return type of the callable
479      * @param <T> The type of checked exception the callable may throw
480      * @return The value returned from the callable
481      */
482     public static <O, T extends Throwable> O call(final FailableCallable<O, T> callable) {
483         return get(callable::call);
484     }
485 
486     /**
487      * Gets the result of invoking the supplier.
488      *
489      * @param supplier The supplier to invoke.
490      * @param <O> The supplier's output type.
491      * @param <T> The type of checked exception, which the supplier can throw.
492      * @return The object, which has been created by the supplier
493      * @since 3.10
494      */
495     public static <O, T extends Throwable> O get(final FailableSupplier<O, T> supplier) {
496         try {
497             return supplier.get();
498         } catch (final Throwable t) {
499             throw rethrow(t);
500         }
501     }
502 
503     /**
504      * Gets the result of invoking the boolean supplier.
505      *
506      * @param supplier The boolean supplier to invoke.
507      * @param <T> The type of checked exception, which the supplier can throw.
508      * @return The boolean, which has been created by the supplier
509      */
510     private static <T extends Throwable> boolean getAsBoolean(final FailableBooleanSupplier<T> supplier) {
511         try {
512             return supplier.getAsBoolean();
513         } catch (final Throwable t) {
514             throw rethrow(t);
515         }
516     }
517 
518     /**
519      * Rethrows a {@link Throwable} as an unchecked exception. If the argument is already unchecked, namely a
520      * {@link RuntimeException} or {@link Error} then the argument will be rethrown without modification. If the
521      * exception is {@link IOException} then it will be wrapped into a {@link UncheckedIOException}. In every other
522      * cases the exception will be wrapped into a {@code
523      * UndeclaredThrowableException}
524      *
525      * <p>
526      * Note that there is a declared return type for this method, even though it never returns. The reason for that is
527      * to support the usual pattern:
528      * </p>
529      *
530      * <pre>
531      * throw rethrow(myUncheckedException);</pre>
532      *
533      * <p>
534      * instead of just calling the method. This pattern may help the Java compiler to recognize that at that point an
535      * exception will be thrown and the code flow analysis will not demand otherwise mandatory commands that could
536      * follow the method call, like a {@code return} statement from a value returning method.
537      * </p>
538      *
539      * @param throwable The throwable to rethrow possibly wrapped into an unchecked exception
540      * @return Never returns anything, this method never terminates normally.
541      */
542     public static RuntimeException rethrow(final Throwable throwable) {
543         Objects.requireNonNull(throwable, "throwable");
544         ExceptionUtils.throwUnchecked(throwable);
545         if (throwable instanceof IOException) {
546             throw new UncheckedIOException((IOException) throwable);
547         }
548         throw new UndeclaredThrowableException(throwable);
549     }
550 
551     /**
552      * Runs a runnable and rethrows any exception as a {@link RuntimeException}.
553      *
554      * @param runnable The runnable to run
555      * @param <T> The type of checked exception the runnable may throw
556      */
557     public static <T extends Throwable> void run(final FailableRunnable<T> runnable) {
558         try {
559             runnable.run();
560         } catch (final Throwable t) {
561             throw rethrow(t);
562         }
563     }
564 
565     /**
566      * Converts the given collection into a {@link FailableStream}. The {@link FailableStream} consists of the
567      * collections elements. Shortcut for
568      *
569      * <pre>
570      * Functions.stream(collection.stream());</pre>
571      *
572      * @param collection The collection, which is being converted into a {@link FailableStream}.
573      * @param <O> The collections element type. (In turn, the result streams element type.)
574      * @return The created {@link FailableStream}.
575      * @since 3.10
576      */
577     public static <O> FailableStream<O> stream(final Collection<O> collection) {
578         return new FailableStream<>(collection.stream());
579     }
580 
581     /**
582      * Converts the given stream into a {@link FailableStream}. The {@link FailableStream} consists of the same
583      * elements, than the input stream. However, failable lambdas, like {@link FailablePredicate},
584      * {@link FailableFunction}, and {@link FailableConsumer} may be applied, rather than {@link Predicate},
585      * {@link Function}, {@link Consumer}, etc.
586      *
587      * @param stream The stream, which is being converted into a {@link FailableStream}.
588      * @param <O> The streams element type.
589      * @return The created {@link FailableStream}.
590      * @since 3.10
591      */
592     public static <O> FailableStream<O> stream(final Stream<O> stream) {
593         return new FailableStream<>(stream);
594     }
595 
596     /**
597      * Tests a predicate and rethrows any exception as a {@link RuntimeException}.
598      *
599      * @param predicate The predicate to test
600      * @param object1 The first input to test by {@code predicate}
601      * @param object2 The second input to test by {@code predicate}
602      * @param <O1> the type of the first argument the predicate tests
603      * @param <O2> the type of the second argument the predicate tests
604      * @param <T> The type of checked exception the predicate may throw
605      * @return The boolean value returned by the predicate
606      */
607     public static <O1, O2, T extends Throwable> boolean test(final FailableBiPredicate<O1, O2, T> predicate,
608         final O1 object1, final O2 object2) {
609         return getAsBoolean(() -> predicate.test(object1, object2));
610     }
611 
612     /**
613      * Tests a predicate and rethrows any exception as a {@link RuntimeException}.
614      *
615      * @param predicate The predicate to test
616      * @param object The input to test by {@code predicate}
617      * @param <O> The type of argument the predicate tests
618      * @param <T> The type of checked exception the predicate may throw
619      * @return The boolean value returned by the predicate
620      */
621     public static <O, T extends Throwable> boolean test(final FailablePredicate<O, T> predicate, final O object) {
622         return getAsBoolean(() -> predicate.test(object));
623     }
624 
625     /**
626      * A simple try-with-resources implementation, that can be used, if your objects do not implement the
627      * {@link AutoCloseable} interface. The method executes the {@code action}. The method guarantees, that <em>all</em>
628      * the {@code resources} are being executed, in the given order, afterwards, and regardless of success, or failure.
629      * If either the original action, or any of the resource action fails, then the <em>first</em> failure (AKA
630      * {@link Throwable}) is rethrown. Example use:
631      *
632      * <pre>
633      * {@code
634      *     final FileInputStream fis = new FileInputStream("my.file");
635      *     Functions.tryWithResources(useInputStream(fis), null, () -> fis.close());
636      * }</pre>
637      *
638      * @param action The action to execute. This object <em>will</em> always be invoked.
639      * @param errorHandler An optional error handler, which will be invoked finally, if any error occurred. The error
640      *        handler will receive the first error, AKA {@link Throwable}.
641      * @param resources The resource actions to execute. <em>All</em> resource actions will be invoked, in the given
642      *        order. A resource action is an instance of {@link FailableRunnable}, which will be executed.
643      * @see #tryWithResources(FailableRunnable, FailableRunnable...)
644      */
645     @SafeVarargs
646     public static void tryWithResources(final FailableRunnable<? extends Throwable> action,
647         final FailableConsumer<Throwable, ? extends Throwable> errorHandler,
648         final FailableRunnable<? extends Throwable>... resources) {
649         final org.apache.commons.lang3.function.FailableRunnable<?>[] fr = new org.apache.commons.lang3.function.FailableRunnable[resources.length];
650         Arrays.setAll(fr, i -> () -> resources[i].run());
651         Failable.tryWithResources(action::run, errorHandler != null ? errorHandler::accept : null, fr);
652     }
653 
654     /**
655      * A simple try-with-resources implementation, that can be used, if your objects do not implement the
656      * {@link AutoCloseable} interface. The method executes the {@code action}. The method guarantees, that <em>all</em>
657      * the {@code resources} are being executed, in the given order, afterwards, and regardless of success, or failure.
658      * If either the original action, or any of the resource action fails, then the <em>first</em> failure (AKA
659      * {@link Throwable}) is rethrown. Example use:
660      *
661      * <pre>
662      * {@code
663      *     final FileInputStream fis = new FileInputStream("my.file");
664      *     Functions.tryWithResources(useInputStream(fis), () -> fis.close());
665      * }</pre>
666      *
667      * @param action The action to execute. This object <em>will</em> always be invoked.
668      * @param resources The resource actions to execute. <em>All</em> resource actions will be invoked, in the given
669      *        order. A resource action is an instance of {@link FailableRunnable}, which will be executed.
670      * @see #tryWithResources(FailableRunnable, FailableConsumer, FailableRunnable...)
671      */
672     @SafeVarargs
673     public static void tryWithResources(final FailableRunnable<? extends Throwable> action,
674         final FailableRunnable<? extends Throwable>... resources) {
675         tryWithResources(action, null, resources);
676     }
677 
678     /**
679      * Constructs a new instance.
680      */
681     public Functions() {
682         // empty
683     }
684 }