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<O>} with a {@link FailableConsumer
59 * FailableConsumer<O,? extends Throwable>}, 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 }