/*
* Copyright 2012-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.context.properties.bind;
import java.util.NoSuchElementException;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
A container object to return the result of a Binder
bind operation. May contain either a successfully bound object or an empty result. Author: Phillip Webb, Madhura Bhave Type parameters: - <T> – the result type
Since: 2.0.0
/**
* A container object to return the result of a {@link Binder} bind operation. May contain
* either a successfully bound object or an empty result.
*
* @param <T> the result type
* @author Phillip Webb
* @author Madhura Bhave
* @since 2.0.0
*/
public final class BindResult<T> {
private static final BindResult<?> UNBOUND = new BindResult<>(null);
private final T value;
private BindResult(T value) {
this.value = value;
}
Return the object that was bound or throw a NoSuchElementException
if no value was bound. Throws: - NoSuchElementException – if no value was bound
See Also: Returns: the bound value (never null
)
/**
* Return the object that was bound or throw a {@link NoSuchElementException} if no
* value was bound.
* @return the bound value (never {@code null})
* @throws NoSuchElementException if no value was bound
* @see #isBound()
*/
public T get() throws NoSuchElementException {
if (this.value == null) {
throw new NoSuchElementException("No value bound");
}
return this.value;
}
Returns true
if a result was bound. Returns: if a result was bound
/**
* Returns {@code true} if a result was bound.
* @return if a result was bound
*/
public boolean isBound() {
return (this.value != null);
}
Invoke the specified consumer with the bound value, or do nothing if no value has
been bound.
Params: - consumer – block to execute if a value has been bound
/**
* Invoke the specified consumer with the bound value, or do nothing if no value has
* been bound.
* @param consumer block to execute if a value has been bound
*/
public void ifBound(Consumer<? super T> consumer) {
Assert.notNull(consumer, "Consumer must not be null");
if (this.value != null) {
consumer.accept(this.value);
}
}
Apply the provided mapping function to the bound value, or return an updated
unbound result if no value has been bound.
Params: - mapper – a mapping function to apply to the bound value. The mapper will not
be invoked if no value has been bound.
Type parameters: - <U> – the type of the result of the mapping function
Returns: an BindResult
describing the result of applying a mapping function to the value of this BindResult
.
/**
* Apply the provided mapping function to the bound value, or return an updated
* unbound result if no value has been bound.
* @param <U> the type of the result of the mapping function
* @param mapper a mapping function to apply to the bound value. The mapper will not
* be invoked if no value has been bound.
* @return an {@code BindResult} describing the result of applying a mapping function
* to the value of this {@code BindResult}.
*/
public <U> BindResult<U> map(Function<? super T, ? extends U> mapper) {
Assert.notNull(mapper, "Mapper must not be null");
return of((this.value != null) ? mapper.apply(this.value) : null);
}
Return the object that was bound, or other
if no value has been bound. Params: - other – the value to be returned if there is no bound value (may be
null
)
Returns: the value, if bound, otherwise other
/**
* Return the object that was bound, or {@code other} if no value has been bound.
* @param other the value to be returned if there is no bound value (may be
* {@code null})
* @return the value, if bound, otherwise {@code other}
*/
public T orElse(T other) {
return (this.value != null) ? this.value : other;
}
Return the object that was bound, or the result of invoking other
if no value has been bound. Params: - other – a
Supplier
of the value to be returned if there is no bound value
Returns: the value, if bound, otherwise the supplied other
/**
* Return the object that was bound, or the result of invoking {@code other} if no
* value has been bound.
* @param other a {@link Supplier} of the value to be returned if there is no bound
* value
* @return the value, if bound, otherwise the supplied {@code other}
*/
public T orElseGet(Supplier<? extends T> other) {
return (this.value != null) ? this.value : other.get();
}
Return the object that was bound, or throw an exception to be created by the
provided supplier if no value has been bound.
Params: - exceptionSupplier – the supplier which will return the exception to be thrown
Type parameters: - <X> – the type of the exception to be thrown
Throws: - X – if there is no value present
Returns: the present value
/**
* Return the object that was bound, or throw an exception to be created by the
* provided supplier if no value has been bound.
* @param <X> the type of the exception to be thrown
* @param exceptionSupplier the supplier which will return the exception to be thrown
* @return the present value
* @throws X if there is no value present
*/
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (this.value == null) {
throw exceptionSupplier.get();
}
return this.value;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
return ObjectUtils.nullSafeEquals(this.value, ((BindResult<?>) obj).value);
}
@Override
public int hashCode() {
return ObjectUtils.nullSafeHashCode(this.value);
}
@SuppressWarnings("unchecked")
static <T> BindResult<T> of(T value) {
if (value == null) {
return (BindResult<T>) UNBOUND;
}
return new BindResult<>(value);
}
}