Package io.vavr.control
Class Validation<E,T>
- java.lang.Object
-
- io.vavr.control.Validation<E,T>
-
- Type Parameters:
E
- value type in the case of invalidT
- value type in the case of valid
- Direct Known Subclasses:
Validation.Invalid
,Validation.Valid
public abstract class Validation<E,T> extends java.lang.Object implements Iterable<T>, Value<T>, java.io.Serializable
An implementation similar to scalaz's Validation control.The Validation type is different from a Monad type, it is an applicative functor. Whereas a Monad will short circuit after the first error, the applicative functor will continue on, accumulating ALL errors. This is especially helpful in cases such as validation, where you want to know all the validation errors that have occurred, not just the first one.
Validation construction: Valid: Validation<String,Integer> valid = Validation.valid(5); Invalid: Validation<List<String>,Integer> invalid = Validation.invalid(List.of("error1","error2")); Validation combination: Validation<String,String> valid1 = Validation.valid("John"); Validation<String,Integer> valid2 = Validation.valid(5); Validation<String,Option<String>> valid3 = Validation.valid(Option.of("123 Fake St.")); Function3<String,Integer,Option<String>,Person> f = ...; Validation<List<String>,String> result = valid1.combine(valid2).ap((name,age) -> "Name: "+name+" Age: "+age); Validation<List<String>,Person> result2 = valid1.combine(valid2).combine(valid3).ap(f); Another form of combining validations: Validation<List<String>,Person> result3 = Validation.combine(valid1, valid2, valid3).ap(f);
- See Also:
- Validation, Serialized Form
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
Validation.Builder<E,T1,T2>
static class
Validation.Builder3<E,T1,T2,T3>
static class
Validation.Builder4<E,T1,T2,T3,T4>
static class
Validation.Builder5<E,T1,T2,T3,T4,T5>
static class
Validation.Builder6<E,T1,T2,T3,T4,T5,T6>
static class
Validation.Builder7<E,T1,T2,T3,T4,T5,T6,T7>
static class
Validation.Builder8<E,T1,T2,T3,T4,T5,T6,T7,T8>
static class
Validation.Invalid<E,T>
Deprecated.will be removed from the public APIstatic class
Validation.Valid<E,T>
Deprecated.will be removed from the public API
-
Method Summary
Modifier and Type Method Description <U> Validation<Seq<E>,U>
ap(Validation<Seq<E>,? extends java.util.function.Function<? super T,? extends U>> validation)
<E2,T2>
Validation<E2,T2>bimap(java.util.function.Function<? super E,? extends E2> errorMapper, java.util.function.Function<? super T,? extends T2> valueMapper)
Whereas map only performs a mapping on a valid Validation, and mapError performs a mapping on an invalid Validation, bimap allows you to provide mapping actions for both, and will give you the result based on what type of Validation this is.static <E,T1,T2>
Validation.Builder<E,T1,T2>combine(Validation<E,T1> validation1, Validation<E,T2> validation2)
Combines twoValidation
s into aValidation.Builder
.static <E,T1,T2,T3>
Validation.Builder3<E,T1,T2,T3>combine(Validation<E,T1> validation1, Validation<E,T2> validation2, Validation<E,T3> validation3)
Combines threeValidation
s into aValidation.Builder3
.static <E,T1,T2,T3,T4>
Validation.Builder4<E,T1,T2,T3,T4>combine(Validation<E,T1> validation1, Validation<E,T2> validation2, Validation<E,T3> validation3, Validation<E,T4> validation4)
Combines fourValidation
s into aValidation.Builder4
.static <E,T1,T2,T3,T4,T5>
Validation.Builder5<E,T1,T2,T3,T4,T5>combine(Validation<E,T1> validation1, Validation<E,T2> validation2, Validation<E,T3> validation3, Validation<E,T4> validation4, Validation<E,T5> validation5)
Combines fiveValidation
s into aValidation.Builder5
.static <E,T1,T2,T3,T4,T5,T6>
Validation.Builder6<E,T1,T2,T3,T4,T5,T6>combine(Validation<E,T1> validation1, Validation<E,T2> validation2, Validation<E,T3> validation3, Validation<E,T4> validation4, Validation<E,T5> validation5, Validation<E,T6> validation6)
Combines sixValidation
s into aValidation.Builder6
.static <E,T1,T2,T3,T4,T5,T6,T7>
Validation.Builder7<E,T1,T2,T3,T4,T5,T6,T7>combine(Validation<E,T1> validation1, Validation<E,T2> validation2, Validation<E,T3> validation3, Validation<E,T4> validation4, Validation<E,T5> validation5, Validation<E,T6> validation6, Validation<E,T7> validation7)
Combines sevenValidation
s into aValidation.Builder7
.static <E,T1,T2,T3,T4,T5,T6,T7,T8>
Validation.Builder8<E,T1,T2,T3,T4,T5,T6,T7,T8>combine(Validation<E,T1> validation1, Validation<E,T2> validation2, Validation<E,T3> validation3, Validation<E,T4> validation4, Validation<E,T5> validation5, Validation<E,T6> validation6, Validation<E,T7> validation7, Validation<E,T8> validation8)
Combines eightValidation
s into aValidation.Builder8
.<U> Validation.Builder<E,T,U>
combine(Validation<E,U> validation)
Combines twoValidation
s to form aValidation.Builder
, which can then be used to perform further combines, or apply a function to it in order to transform theValidation.Builder
into aValidation
.Option<Validation<E,T>>
filter(java.util.function.Predicate<? super T> predicate)
<U> Validation<E,U>
flatMap(java.util.function.Function<? super T,? extends Validation<E,? extends U>> mapper)
<U> U
fold(java.util.function.Function<? super E,? extends U> ifInvalid, java.util.function.Function<? super T,? extends U> ifValid)
Transforms thisValidation
to a value of typeU
.void
forEach(java.util.function.Consumer<? super T> action)
Performs the given action for the value contained inValid
, or does nothing if this is anInvalid
.static <E,T>
Validation<E,T>fromEither(Either<E,T> either)
Creates aValidation
of anEither
.static <T> Validation<java.lang.Throwable,T>
fromTry(Try<? extends T> t)
Creates aValidation
of anTry
.abstract T
get()
Gets the value of thisValidation
if is aValid
or throws if this is anInvalid
.abstract E
getError()
Gets the error of this Validation if it is anInvalid
or throws if this is aValid
.T
getOrElseGet(java.util.function.Function<? super E,? extends T> other)
Gets the value if it is a Valid or an value calculated from the error.static <E,T>
Validation<E,T>invalid(E error)
Creates anValidation.Invalid
that contains the givenerror
.boolean
isAsync()
AValidation
's value is computed synchronously.boolean
isEmpty()
Checks, thisValue
is empty, i.e.abstract boolean
isInvalid()
Check whether this is of typeInvalid
boolean
isLazy()
AValidation
's value is computed eagerly.boolean
isSingleValued()
States whether this is a single-valued type.abstract boolean
isValid()
Check whether this is of typeValid
Iterator<T>
iterator()
Returns a richIterator
that allows us to perform intermediate, sequential operations known from Vavr's collection library.<U> Validation<E,U>
map(java.util.function.Function<? super T,? extends U> f)
Maps the underlying value to a different component type.<U> Validation<U,T>
mapError(java.util.function.Function<? super E,? extends U> f)
Applies a function f to the error of this Validation if this is an Invalid.static <E,T>
Validation<E,T>narrow(Validation<? extends E,? extends T> validation)
Narrows a widenedValidation<? extends E, ? extends T>
toValidation<E, T>
by performing a type-safe cast.Validation<E,T>
orElse(Validation<? extends E,? extends T> other)
Returns thisValidation
if it is valid, otherwise return the alternative.Validation<E,T>
orElse(java.util.function.Supplier<Validation<? extends E,? extends T>> supplier)
Returns thisValidation
if it is valid, otherwise return the result of evaluating supplier.Validation<E,T>
peek(java.util.function.Consumer<? super T> action)
Performs the givenaction
on the first element if this is an eager implementation.static <E,T>
Validation<Seq<E>,Seq<T>>sequence(java.lang.Iterable<? extends Validation<? extends Seq<? extends E>,? extends T>> values)
Reduces manyValidation
instances into a singleValidation
by transforming anIterable<Validation<? extends T>>
into aValidation<Seq<T>>
.Validation<T,E>
swap()
Flip the valid/invalid values for this Validation.Either<E,T>
toEither()
Converts this Validation to anEither
.static <E,T,U>
Validation<Seq<E>,Seq<U>>traverse(java.lang.Iterable<? extends T> values, java.util.function.Function<? super T,? extends Validation<? extends Seq<? extends E>,? extends U>> mapper)
Maps the values of an iterable to a sequence of mapped values into a singleValidation
by transforming anIterable<? extends T>
into aValidation<Seq<U>>
.static <E,T>
Validation<E,T>valid(T value)
Creates aValidation.Valid
that contains the givenvalue
.-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface io.vavr.Value
collect, collect, contains, corresponds, eq, equals, exists, forAll, getOrElse, getOrElse, getOrElseThrow, getOrElseTry, getOrNull, hashCode, out, out, spliterator, stderr, stdout, stringPrefix, toArray, toCharSeq, toCompletableFuture, toEither, toEither, toInvalid, toInvalid, toJavaArray, toJavaArray, toJavaArray, toJavaCollection, toJavaList, toJavaList, toJavaMap, toJavaMap, toJavaMap, toJavaOptional, toJavaParallelStream, toJavaSet, toJavaSet, toJavaStream, toLeft, toLeft, toLinkedMap, toLinkedMap, toLinkedSet, toList, toMap, toMap, toOption, toPriorityQueue, toPriorityQueue, toQueue, toRight, toRight, toSet, toSortedMap, toSortedMap, toSortedMap, toSortedMap, toSortedSet, toSortedSet, toStream, toString, toTree, toTree, toTry, toTry, toValid, toValid, toValidation, toValidation, toVector
-
-
-
-
Method Detail
-
valid
public static <E,T> Validation<E,T> valid(T value)
Creates aValidation.Valid
that contains the givenvalue
.- Type Parameters:
E
- type of the errorT
- type of the givenvalue
- Parameters:
value
- A value- Returns:
Valid(value)
-
invalid
public static <E,T> Validation<E,T> invalid(E error)
Creates anValidation.Invalid
that contains the givenerror
.- Type Parameters:
E
- type of the givenerror
T
- type of the value- Parameters:
error
- An error- Returns:
Invalid(error)
- Throws:
java.lang.NullPointerException
- if error is null
-
fromEither
public static <E,T> Validation<E,T> fromEither(Either<E,T> either)
Creates aValidation
of anEither
.- Type Parameters:
E
- error typeT
- value type- Parameters:
either
- AnEither
- Returns:
- A
Valid(either.get())
if either is a Right, otherwiseInvalid(either.getLeft())
. - Throws:
java.lang.NullPointerException
- if either is null
-
fromTry
public static <T> Validation<java.lang.Throwable,T> fromTry(Try<? extends T> t)
Creates aValidation
of anTry
.- Type Parameters:
T
- type of the valid value- Parameters:
t
- ATry
- Returns:
- A
Valid(t.get())
if t is a Success, otherwiseInvalid(t.getCause())
. - Throws:
java.lang.NullPointerException
- ift
is null
-
sequence
public static <E,T> Validation<Seq<E>,Seq<T>> sequence(java.lang.Iterable<? extends Validation<? extends Seq<? extends E>,? extends T>> values)
Reduces manyValidation
instances into a singleValidation
by transforming anIterable<Validation<? extends T>>
into aValidation<Seq<T>>
.- Type Parameters:
E
- value type in the case of invalidT
- value type in the case of valid- Parameters:
values
- An iterable of Validation instances.- Returns:
- A valid Validation of a sequence of values if all Validation instances are valid or an invalid Validation containing an accumulated List of errors.
- Throws:
java.lang.NullPointerException
- if values is null
-
traverse
public static <E,T,U> Validation<Seq<E>,Seq<U>> traverse(java.lang.Iterable<? extends T> values, java.util.function.Function<? super T,? extends Validation<? extends Seq<? extends E>,? extends U>> mapper)
Maps the values of an iterable to a sequence of mapped values into a singleValidation
by transforming anIterable<? extends T>
into aValidation<Seq<U>>
.- Type Parameters:
T
- The type of the given values.E
- The mapped error value type.U
- The mapped valid value type.- Parameters:
values
- AnIterable
of values.mapper
- A mapper of values to Validations- Returns:
- A
Validation
of aSeq
of results. - Throws:
java.lang.NullPointerException
- if values or f is null.
-
narrow
public static <E,T> Validation<E,T> narrow(Validation<? extends E,? extends T> validation)
Narrows a widenedValidation<? extends E, ? extends T>
toValidation<E, T>
by performing a type-safe cast. This is eligible because immutable/read-only collections are covariant.- Type Parameters:
E
- type of errorT
- type of valid value- Parameters:
validation
- AValidation
.- Returns:
- the given
validation
instance as narrowed typeValidation<E, T>
.
-
combine
public static <E,T1,T2> Validation.Builder<E,T1,T2> combine(Validation<E,T1> validation1, Validation<E,T2> validation2)
Combines twoValidation
s into aValidation.Builder
.- Type Parameters:
E
- type of errorT1
- type of first valid valueT2
- type of second valid value- Parameters:
validation1
- first validationvalidation2
- second validation- Returns:
- an instance of Builder<E,T1,T2>
- Throws:
java.lang.NullPointerException
- if validation1 or validation2 is null
-
combine
public static <E,T1,T2,T3> Validation.Builder3<E,T1,T2,T3> combine(Validation<E,T1> validation1, Validation<E,T2> validation2, Validation<E,T3> validation3)
Combines threeValidation
s into aValidation.Builder3
.- Type Parameters:
E
- type of errorT1
- type of first valid valueT2
- type of second valid valueT3
- type of third valid value- Parameters:
validation1
- first validationvalidation2
- second validationvalidation3
- third validation- Returns:
- an instance of Builder3<E,T1,T2,T3>
- Throws:
java.lang.NullPointerException
- if validation1, validation2 or validation3 is null
-
combine
public static <E,T1,T2,T3,T4> Validation.Builder4<E,T1,T2,T3,T4> combine(Validation<E,T1> validation1, Validation<E,T2> validation2, Validation<E,T3> validation3, Validation<E,T4> validation4)
Combines fourValidation
s into aValidation.Builder4
.- Type Parameters:
E
- type of errorT1
- type of first valid valueT2
- type of second valid valueT3
- type of third valid valueT4
- type of fourth valid value- Parameters:
validation1
- first validationvalidation2
- second validationvalidation3
- third validationvalidation4
- fourth validation- Returns:
- an instance of Builder3<E,T1,T2,T3,T4>
- Throws:
java.lang.NullPointerException
- if validation1, validation2, validation3 or validation4 is null
-
combine
public static <E,T1,T2,T3,T4,T5> Validation.Builder5<E,T1,T2,T3,T4,T5> combine(Validation<E,T1> validation1, Validation<E,T2> validation2, Validation<E,T3> validation3, Validation<E,T4> validation4, Validation<E,T5> validation5)
Combines fiveValidation
s into aValidation.Builder5
.- Type Parameters:
E
- type of errorT1
- type of first valid valueT2
- type of second valid valueT3
- type of third valid valueT4
- type of fourth valid valueT5
- type of fifth valid value- Parameters:
validation1
- first validationvalidation2
- second validationvalidation3
- third validationvalidation4
- fourth validationvalidation5
- fifth validation- Returns:
- an instance of Builder3<E,T1,T2,T3,T4,T5>
- Throws:
java.lang.NullPointerException
- if validation1, validation2, validation3, validation4 or validation5 is null
-
combine
public static <E,T1,T2,T3,T4,T5,T6> Validation.Builder6<E,T1,T2,T3,T4,T5,T6> combine(Validation<E,T1> validation1, Validation<E,T2> validation2, Validation<E,T3> validation3, Validation<E,T4> validation4, Validation<E,T5> validation5, Validation<E,T6> validation6)
Combines sixValidation
s into aValidation.Builder6
.- Type Parameters:
E
- type of errorT1
- type of first valid valueT2
- type of second valid valueT3
- type of third valid valueT4
- type of fourth valid valueT5
- type of fifth valid valueT6
- type of sixth valid value- Parameters:
validation1
- first validationvalidation2
- second validationvalidation3
- third validationvalidation4
- fourth validationvalidation5
- fifth validationvalidation6
- sixth validation- Returns:
- an instance of Builder3<E,T1,T2,T3,T4,T5,T6>
- Throws:
java.lang.NullPointerException
- if validation1, validation2, validation3, validation4, validation5 or validation6 is null
-
combine
public static <E,T1,T2,T3,T4,T5,T6,T7> Validation.Builder7<E,T1,T2,T3,T4,T5,T6,T7> combine(Validation<E,T1> validation1, Validation<E,T2> validation2, Validation<E,T3> validation3, Validation<E,T4> validation4, Validation<E,T5> validation5, Validation<E,T6> validation6, Validation<E,T7> validation7)
Combines sevenValidation
s into aValidation.Builder7
.- Type Parameters:
E
- type of errorT1
- type of first valid valueT2
- type of second valid valueT3
- type of third valid valueT4
- type of fourth valid valueT5
- type of fifth valid valueT6
- type of sixth valid valueT7
- type of seventh valid value- Parameters:
validation1
- first validationvalidation2
- second validationvalidation3
- third validationvalidation4
- fourth validationvalidation5
- fifth validationvalidation6
- sixth validationvalidation7
- seventh validation- Returns:
- an instance of Builder3<E,T1,T2,T3,T4,T5,T6,T7>
- Throws:
java.lang.NullPointerException
- if validation1, validation2, validation3, validation4, validation5, validation6 or validation7 is null
-
combine
public static <E,T1,T2,T3,T4,T5,T6,T7,T8> Validation.Builder8<E,T1,T2,T3,T4,T5,T6,T7,T8> combine(Validation<E,T1> validation1, Validation<E,T2> validation2, Validation<E,T3> validation3, Validation<E,T4> validation4, Validation<E,T5> validation5, Validation<E,T6> validation6, Validation<E,T7> validation7, Validation<E,T8> validation8)
Combines eightValidation
s into aValidation.Builder8
.- Type Parameters:
E
- type of errorT1
- type of first valid valueT2
- type of second valid valueT3
- type of third valid valueT4
- type of fourth valid valueT5
- type of fifth valid valueT6
- type of sixth valid valueT7
- type of seventh valid valueT8
- type of eighth valid value- Parameters:
validation1
- first validationvalidation2
- second validationvalidation3
- third validationvalidation4
- fourth validationvalidation5
- fifth validationvalidation6
- sixth validationvalidation7
- seventh validationvalidation8
- eighth validation- Returns:
- an instance of Builder3<E,T1,T2,T3,T4,T5,T6,T7,T8>
- Throws:
java.lang.NullPointerException
- if validation1, validation2, validation3, validation4, validation5, validation6, validation7 or validation8 is null
-
isValid
public abstract boolean isValid()
Check whether this is of typeValid
- Returns:
- true if is a Valid, false if is an Invalid
-
isInvalid
public abstract boolean isInvalid()
Check whether this is of typeInvalid
- Returns:
- true if is an Invalid, false if is a Valid
-
orElse
public final Validation<E,T> orElse(Validation<? extends E,? extends T> other)
Returns thisValidation
if it is valid, otherwise return the alternative.- Parameters:
other
- An alternativeValidation
- Returns:
- this
Validation
if it is valid, otherwise return the alternative.
-
orElse
public final Validation<E,T> orElse(java.util.function.Supplier<Validation<? extends E,? extends T>> supplier)
Returns thisValidation
if it is valid, otherwise return the result of evaluating supplier.- Parameters:
supplier
- An alternativeValidation
supplier- Returns:
- this
Validation
if it is valid, otherwise return the result of evaluating supplier.
-
isEmpty
public final boolean isEmpty()
Description copied from interface:Value
Checks, thisValue
is empty, i.e. if the underlying value is absent.
-
get
public abstract T get()
Gets the value of thisValidation
if is aValid
or throws if this is anInvalid
.
-
getOrElseGet
public final T getOrElseGet(java.util.function.Function<? super E,? extends T> other)
Gets the value if it is a Valid or an value calculated from the error.- Parameters:
other
- a function which converts an error to an alternative value- Returns:
- the value, if the underlying Validation is a Valid, or else the alternative value
provided by
other
by applying the error.
-
getError
public abstract E getError()
Gets the error of this Validation if it is anInvalid
or throws if this is aValid
.- Returns:
- The error, if present
- Throws:
java.lang.RuntimeException
- if this is aValid
-
toEither
public final Either<E,T> toEither()
Converts this Validation to anEither
.- Returns:
Either.right(get())
if this is valid, otherwiseEither.left(getError())
.
-
forEach
public final void forEach(java.util.function.Consumer<? super T> action)
Performs the given action for the value contained inValid
, or does nothing if this is anInvalid
.
-
fold
public final <U> U fold(java.util.function.Function<? super E,? extends U> ifInvalid, java.util.function.Function<? super T,? extends U> ifValid)
Transforms thisValidation
to a value of typeU
.Example:
Validation<List<String>, String> valid = ...;<br> int i = valid.fold(List::length, String::length);
- Type Parameters:
U
- the fold result type- Parameters:
ifInvalid
- an error mapperifValid
- an mapper for a valid value- Returns:
ifValid.apply(get())
if this is valid, otherwiseifInvalid.apply(getError())
.- Throws:
java.lang.NullPointerException
- if one of the given mappersifInvalid
orifValid
is null
-
swap
public final Validation<T,E> swap()
Flip the valid/invalid values for this Validation. If this is a Valid<E,T>, returns Invalid<T,E>. Or if this is an Invalid<E,T>, return a Valid<T,E>.- Returns:
- a flipped instance of Validation
-
map
public final <U> Validation<E,U> map(java.util.function.Function<? super T,? extends U> f)
Description copied from interface:Value
Maps the underlying value to a different component type.
-
bimap
public final <E2,T2> Validation<E2,T2> bimap(java.util.function.Function<? super E,? extends E2> errorMapper, java.util.function.Function<? super T,? extends T2> valueMapper)
Whereas map only performs a mapping on a valid Validation, and mapError performs a mapping on an invalid Validation, bimap allows you to provide mapping actions for both, and will give you the result based on what type of Validation this is. Without this, you would have to do something like: validation.map(...).mapError(...);- Type Parameters:
E2
- type of the mapping result if this is an invalidT2
- type of the mapping result if this is a valid- Parameters:
errorMapper
- the invalid mapping operationvalueMapper
- the valid mapping operation- Returns:
- an instance of Validation<U,R>
- Throws:
java.lang.NullPointerException
- if invalidMapper or validMapper is null
-
mapError
public final <U> Validation<U,T> mapError(java.util.function.Function<? super E,? extends U> f)
Applies a function f to the error of this Validation if this is an Invalid. Otherwise does nothing if this is a Valid.- Type Parameters:
U
- type of the error resulting from the mapping- Parameters:
f
- a function that maps the error in this Invalid- Returns:
- an instance of Validation<U,T>
- Throws:
java.lang.NullPointerException
- if mapping operation f is null
-
ap
public final <U> Validation<Seq<E>,U> ap(Validation<Seq<E>,? extends java.util.function.Function<? super T,? extends U>> validation)
-
combine
public final <U> Validation.Builder<E,T,U> combine(Validation<E,U> validation)
Combines twoValidation
s to form aValidation.Builder
, which can then be used to perform further combines, or apply a function to it in order to transform theValidation.Builder
into aValidation
.- Type Parameters:
U
- type of the value contained in validation- Parameters:
validation
- the validation object to combine this with- Returns:
- an instance of Builder
-
filter
public final Option<Validation<E,T>> filter(java.util.function.Predicate<? super T> predicate)
-
flatMap
public final <U> Validation<E,U> flatMap(java.util.function.Function<? super T,? extends Validation<E,? extends U>> mapper)
-
peek
public final Validation<E,T> peek(java.util.function.Consumer<? super T> action)
Description copied from interface:Value
Performs the givenaction
on the first element if this is an eager implementation. Performs the givenaction
on all elements (the first immediately, successive deferred), if this is a lazy implementation.
-
isAsync
public final boolean isAsync()
AValidation
's value is computed synchronously.
-
isLazy
public final boolean isLazy()
AValidation
's value is computed eagerly.
-
isSingleValued
public final boolean isSingleValued()
Description copied from interface:Value
States whether this is a single-valued type.- Specified by:
isSingleValued
in interfaceValue<E>
- Returns:
true
if this is single-valued,false
otherwise.
-
-