| 1 | package com.yubico.internal.util; | |
| 2 | ||
| 3 | import java.util.Optional; | |
| 4 | import java.util.function.BinaryOperator; | |
| 5 | import java.util.function.Supplier; | |
| 6 | import java.util.stream.Stream; | |
| 7 | import lombok.NonNull; | |
| 8 | import lombok.experimental.UtilityClass; | |
| 9 | ||
| 10 | /** Utilities for working with {@link Optional} values. */ | |
| 11 | @UtilityClass | |
| 12 | public class OptionalUtil { | |
| 13 | ||
| 14 | /** | |
| 15 | * If <code>primary</code> is present, return it unchanged. Otherwise return <code> | |
| 16 | * secondary</code>. | |
| 17 | */ | |
| 18 | public static <T> Optional<T> orOptional(Optional<T> primary, Optional<T> secondary) { | |
| 19 |
1
1. orOptional : negated conditional → NO_COVERAGE |
if (primary.isPresent()) { |
| 20 |
1
1. orOptional : replaced return value with Optional.empty for com/yubico/internal/util/OptionalUtil::orOptional → NO_COVERAGE |
return primary; |
| 21 | } else { | |
| 22 |
1
1. orOptional : replaced return value with Optional.empty for com/yubico/internal/util/OptionalUtil::orOptional → NO_COVERAGE |
return secondary; |
| 23 | } | |
| 24 | } | |
| 25 | ||
| 26 | /** | |
| 27 | * If <code>primary</code> is present, return it unchanged. Otherwise return the result of <code> | |
| 28 | * recover</code>. | |
| 29 | */ | |
| 30 | public static <T> Optional<T> orElseOptional(Optional<T> primary, Supplier<Optional<T>> recover) { | |
| 31 |
1
1. orElseOptional : negated conditional → NO_COVERAGE |
if (primary.isPresent()) { |
| 32 |
1
1. orElseOptional : replaced return value with Optional.empty for com/yubico/internal/util/OptionalUtil::orElseOptional → NO_COVERAGE |
return primary; |
| 33 | } else { | |
| 34 |
1
1. orElseOptional : replaced return value with Optional.empty for com/yubico/internal/util/OptionalUtil::orElseOptional → NO_COVERAGE |
return recover.get(); |
| 35 | } | |
| 36 | } | |
| 37 | ||
| 38 | /** | |
| 39 | * Returns a sequential {@link Stream} with this {@link Optional} as its source. | |
| 40 | * | |
| 41 | * @param o the {@link Optional} to interpret as a {@link Stream} | |
| 42 | * @return a sequential {@link Stream} containing the value of this {@link Optional} if present, | |
| 43 | * otherwise an empty {@link Stream}. | |
| 44 | */ | |
| 45 |
1
1. stream : negated conditional → NO_COVERAGE |
public static <T> Stream<T> stream(@NonNull Optional<T> o) { |
| 46 |
1
1. stream : replaced return value with Stream.empty for com/yubico/internal/util/OptionalUtil::stream → NO_COVERAGE |
return o.map(Stream::of).orElseGet(Stream::empty); |
| 47 | } | |
| 48 | ||
| 49 | /** | |
| 50 | * If both <code>a</code> and <code>b</code> are present, return <code>f(a, b)</code>. | |
| 51 | * | |
| 52 | * <p>If only <code>a</code> is present, return <code>a</code>. | |
| 53 | * | |
| 54 | * <p>Otherwise, return <code>b</code>. | |
| 55 | */ | |
| 56 | public static <T> Optional<T> zipWith(Optional<T> a, Optional<T> b, BinaryOperator<T> f) { | |
| 57 |
2
1. zipWith : negated conditional → NO_COVERAGE 2. zipWith : negated conditional → NO_COVERAGE |
if (a.isPresent() && b.isPresent()) { |
| 58 |
1
1. zipWith : replaced return value with Optional.empty for com/yubico/internal/util/OptionalUtil::zipWith → NO_COVERAGE |
return Optional.of(f.apply(a.get(), b.get())); |
| 59 |
1
1. zipWith : negated conditional → NO_COVERAGE |
} else if (a.isPresent()) { |
| 60 |
1
1. zipWith : replaced return value with Optional.empty for com/yubico/internal/util/OptionalUtil::zipWith → NO_COVERAGE |
return a; |
| 61 | } else { | |
| 62 |
1
1. zipWith : replaced return value with Optional.empty for com/yubico/internal/util/OptionalUtil::zipWith → NO_COVERAGE |
return b; |
| 63 | } | |
| 64 | } | |
| 65 | } | |
Mutations | ||
| 19 |
1.1 |
|
| 20 |
1.1 |
|
| 22 |
1.1 |
|
| 31 |
1.1 |
|
| 32 |
1.1 |
|
| 34 |
1.1 |
|
| 45 |
1.1 |
|
| 46 |
1.1 |
|
| 57 |
1.1 2.2 |
|
| 58 |
1.1 |
|
| 59 |
1.1 |
|
| 60 |
1.1 |
|
| 62 |
1.1 |