ValueExtractor Type — spring-boot Architecture
Architecture documentation for the ValueExtractor type/interface in JsonWriter.java from the spring-boot codebase.
Entity Profile
Source Code
core/spring-boot/src/main/java/org/springframework/boot/json/JsonWriter.java lines 692–766
@FunctionalInterface
interface ValueExtractor<T extends @Nullable Object> {
/**
* Represents a skipped value.
*/
Object SKIP = new Object();
/**
* Extract the value from the given instance.
* @param instance the source instance
* @return the extracted value or {@link #SKIP}
*/
@Nullable T extract(@Nullable Object instance);
/**
* Only extract when the given predicate matches.
* @param predicate the predicate to test
* @return a new {@link ValueExtractor}
*/
default ValueExtractor<T> when(Predicate<? super @Nullable T> predicate) {
return (instance) -> test(extract(instance), predicate);
}
@SuppressWarnings("unchecked")
private @Nullable T test(@Nullable T extracted, Predicate<? super @Nullable T> predicate) {
return (!skip(extracted) && predicate.test(extracted)) ? extracted : (T) SKIP;
}
/**
* Adapt the extracted value.
* @param <R> the result type
* @param extractor the extractor to use
* @return a new {@link ValueExtractor}
*/
default <R> ValueExtractor<R> as(Extractor<T, R> extractor) {
return (instance) -> apply(extract(instance), extractor);
}
@SuppressWarnings("unchecked")
private <R> @Nullable R apply(@Nullable T value, Extractor<T, R> extractor) {
if (skip(value)) {
return (R) SKIP;
}
return (value != null) ? extractor.extract(value) : null;
}
/**
* Create a new {@link ValueExtractor} based on the given {@link Function}.
* @param <S> the source type
* @param <T> the extracted type
* @param extractor the extractor to use
* @return a new {@link ValueExtractor} instance
*/
@SuppressWarnings("unchecked")
static <S, T> ValueExtractor<T> of(Extractor<S, T> extractor) {
return (instance) -> {
if (instance == null) {
return null;
}
return (skip(instance)) ? (T) SKIP : extractor.extract((S) instance);
};
}
/**
* Return if the extracted value should be skipped.
* @param <T> the value type
* @param extracted the value to test
* @return if the value is to be skipped
*/
static <T> boolean skip(@Nullable T extracted) {
return extracted == SKIP;
}
}
Source
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free