рдХреИрд╕реЗ рддреЗрдЬреА рд╕реЗ JVM рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП

рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЗ рд╣реИрдВ:


  • рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЕрдкрд╡рд╛рдж (рдЬрд╛рд╡рд╛, рд╕реНрдХрд╛рд▓рд╛ рдФрд░ рдЕрдиреНрдп рдЬреЗрд╡реАрдПрдо, рдЕрдЬрдЧрд░, рдФрд░ рдХрдИ рдЕрдиреНрдп)
  • рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдпрд╛ рдзреНрд╡рдЬ (рдЧреЛ, рдорд╛рд░)
  • рд╡рд┐рднрд┐рдиреНрди рдмреАрдЬреАрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдорд╛рди рд╕рдлрд▓ рдкрд░рд┐рдгрд╛рдо рдФрд░ рддреНрд░реБрдЯрд┐ рд╡рд┐рд╡рд░рдг (рд╕реНрдХреЗрд▓, рд╣реИрд╕реЗрд▓ рдФрд░ рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛) рджреЛрдиреЛрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ

рдЕрдкрд╡рд╛рдж рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рджреВрд╕рд░реА рдУрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдХреНрд╕рд░ рдзреАрдорд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╡рд┐рд░реЛрдзреА рдЕрдХреНрд╕рд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдкреАрд▓ рдХрд░рддреЗ рд╣реИрдВред


рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВ рд╕реНрдХрд╛рд▓рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рдореИрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрд╡рд╛рджреЛрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рддреЗрдЬ рд╣реЛрдЧрд╛ред


рд╣рдо рддреБрд░рдВрдд рдХреЛрдб рдФрд░ рдЭрдВрдбреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬреЗрд╡реАрдПрдо рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдмрд╣реБрдд рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рд╣реИ (рдореИрдВ рд╕рдЬрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ)ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкрд╡рд╛рджреЛрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдбреАрдЯреА рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдбреАрдЯреА рдХреЛ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЕрджреНрдпрддрди : рд╕реНрдЯреИрдХ рдХреЗ рдмрд┐рдирд╛ рдЕрдкрд╡рд╛рдж рддреБрд▓рдирд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ


рдкреНрд░рддрд┐рдпреЛрдЧрд┐рдпреЛрдВ


рдмреАрдЬреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрдбреАрдЯреА ( рдПрдбреАрдЯреА ) рд╕реЗ рдмрд╣реБрдд рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ - рдПрдХ рдмреАрдЬреАрдп рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдпреМрдЧрд┐рдХ рдореВрд▓реНрдп (рд╕рдВрд░рдЪрдирд╛, рд░рд┐рдХреЙрд░реНрдб) рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд╛рд░ Option[T] = Some(value: T) | None Option[T] = Some(value: T) | None , рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ nulls рдХреЗ рдмрдЬрд╛рдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рдпрд╛ рддреЛ Some(t) рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдХреЛрдИ рдорд╛рди рд╣реИ, рдпрд╛ None рдЕрдЧрд░ рдпрд╣ рдирд╣реАрдВ рд╣реИред


рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреА Try[T] = Success(value: T) | Failure(exception: Throwable) рдЬрд╛рдПрдЧреА Try[T] = Success(value: T) | Failure(exception: Throwable) Try[T] = Success(value: T) | Failure(exception: Throwable) , рдЬреЛ рдПрдХ рдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдпрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред


рддреЛ рд╣рдорд╛рд░реЗ рдкреНрд░рддрд┐рдпреЛрдЧреА:


  • рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рдЕрдкрд╡рд╛рдж рд╣реИрдВ
  • рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рдмрд┐рдирд╛ рдЕрдкрд╡рд╛рдж, рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЛ рднрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдПрдХ рдмрд╣реБрдд рдзреАрдореА рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реИ
  • Try[T] = Success(value: T) | Failure(exception: Throwable) Try[T] = Success(value: T) | Failure(exception: Throwable) - рд╕рдорд╛рди рдЕрдкрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЖрд╡рд░рдг рдореЗрдВ
  • Either[String, T] = Left(error: String) | Right(value: T) Either[String, T] = Left(error: String) | Right(value: T) - рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдпрд╛ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИ
  • ValidatedNec[String, T] = Valid(value: T) | Invalid(errors: List[String]) ValidatedNec[String, T] = Valid(value: T) | Invalid(errors: List[String]) - рдХреИрдЯреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░, рдЬрд┐рд╕рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рд╕рдВрджреЗрд╢ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдмрд╣реБрдд List рдЙрдкрдпреЛрдЧ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ)

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рддреБрд▓рдирд╛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕, рдмрд┐рдирд╛ рдФрд░ рдПрдЯреАрдбреА рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдПрдХ рднреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реАрдВ рд╣реИ рдФрд░ рдХрдИ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред


рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рд╣реА рд╕рдлрд▓рддрд╛ рдХреЗ рд╕рд╛рде, рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ( Either[Failure, T] )ред


рд╕рдорд╕реНрдпрд╛


рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдХреА рд╕рдорд╕реНрдпрд╛ рд▓реЗрддреЗ рд╣реИрдВ:


 case class Person(name: String, age: Int, isMale: Boolean) type Result[T] = Either[String, T] trait PersonParser { def parse(data: Map[String, String]): Result[Person] } 

рдпрд╛рдиреА рдХрдЪреНрдЪреЗ рдбреЗрдЯрд╛ рдХрд╛ Map[String, String] рдпрджрд┐ рдбреЗрдЯрд╛ рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ Person рдпрд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдлреЗрдВрдХ


рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдорд╛рдереЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди (рдЗрд╕рдХреЗ рдмрд╛рдж рдореИрдВ рдХреЗрд╡рд▓ person рдлрд╝рдВрдХреНрд╢рди рджреЗрдЧрд╛, рдЖрдк рдкреВрд░реНрдг рдХреЛрдб рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
ThrowParser.scala


  def person(data: Map[String, String]): Person = { val name = string(data.getOrElse("name", null)) val age = integer(data.getOrElse("age", null)) val isMale = boolean(data.getOrElse("isMale", null)) require(name.nonEmpty, "name should not be empty") require(age > 0, "age should be positive") Person(name, age, isMale) } 

рдпрд╣рд╛рдВ string , integer рдФрд░ boolean рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рддреЗ рд╣реИрдВред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред


рдереНрд░реЙрдиреНрд╕реНрдЯ (рдиреЛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕)


рдХреЛрдб рдкрд┐рдЫрд▓реЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣ рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реЛ: ThrowNSTParit.alala


рдХреЛрд╢рд┐рд╢


рд╕рдорд╛рдзрд╛рди рдкрд╣рд▓реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд▓реВрдк рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП):
TryParser.scala


  def person(data: Map[String, String]): Try[Person] = for { name <- required(data.get("name")) age <- required(data.get("age")) flatMap integer isMale <- required(data.get("isMale")) flatMap boolean _ <- require(name.nonEmpty, "name should not be empty") _ <- require(age > 0, "age should be positive") } yield Person(name, age, isMale) 

рдПрдХ рдирд╛рдЬреБрдХ рдЖрдВрдЦ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг, рдпрд╣ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЕрд▓рдЧ рд╕реЗ рд╣реЛрддреЗ рд╣реИрдВ ( flatMap рд░реВрдк рдореЗрдВ and then рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)


рднреА


рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рддрдп рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ Result рдЙрд░реНрдл рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИред
EitherParser.scala


  def person(data: Map[String, String]): Result[Person] = for { name <- required(data.get("name")) age <- required(data.get("age")) flatMap integer isMale <- required(data.get("isMale")) flatMap boolean _ <- require(name.nonEmpty, "name should not be empty") _ <- require(age > 0, "age should be positive") } yield Person(name, age, isMale) 

рдЪреВрдВрдХрд┐ рдорд╛рдирдХ Either рдЬреИрд╕реЗ рдХрд┐ Try рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдПрдХ рдореЛрдирд╛рдб рдмрдирд╛рддрд╛ рд╣реИ, рдХреЛрдб рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рдерд╛, рдпрд╣рд╛рдВ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ рдФрд░ рдЕрдкрд╡рд╛рдж рдиреНрдпреВрдирддрдо рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдХреЗрд╡рд▓ рдПрдХ рдирдВрдмрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП)


рдорд╛рдиреНрдп


рдпрд╣рд╛рдБ рдХреИрдЯреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХрдИ рдлрд╝реАрд▓реНрдб рдорд╛рдиреНрдп рдирд╣реАрдВ рдереЗ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдЗрди рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреА)
ValidatedParser.scala


  def person(data: Map[String, String]): Validated[Person] = { val name: Validated[String] = required(data.get("name")) .ensure(one("name should not be empty"))(_.nonEmpty) val age: Validated[Int] = required(data.get("age")) .andThen(integer) .ensure(one("age should be positive"))(_ > 0) val isMale: Validated[Boolean] = required(data.get("isMale")) .andThen(boolean) (name, age, isMale).mapN(Person) } 

рдпрд╣ рдХреЛрдб рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдорд╛рди рдкрд╣рд▓реЗ рд╕реЗ рдХрдо рд╣реИ, рд▓реЗрдХрд┐рди рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдлрд╝реАрд▓реНрдб рд╕реЗ рддрд▓рд╛рдХ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЕрднреА рднреА рдПрдХ рдХреЗ рдмрдЬрд╛рдп рдХрдИ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓рддреА рд╣реИрдВ, рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ!


рдкрд░реАрдХреНрд╖рдг


рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдбреЗрдЯрд╛ рд╕реЗрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рддрд┐рд╢рдд рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рд╣реБрдЖ рдерд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рддрд░реАрдХреЗ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рднреА рдкреНрд░рддрд┐рд╢рдд рдкрд░ рдкрд░рд┐рдгрд╛рдо:


рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдХрдо рдкреНрд░рддрд┐рд╢рдд рдкрд░ ( рдПрдХ рдмрдбрд╝рд╛ рдирдореВрдирд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рд╕рдордп рдпрд╣рд╛рдВ рдЕрд▓рдЧ рд╣реИ):


рдпрджрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХреБрдЫ рд╣рд┐рд╕реНрд╕рд╛ рдЕрднреА рднреА рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдЕрдкрд╡рд╛рдж рд╣реИ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реЛрдЧреА рдЬрд┐рд╕реЗ рд╣рдо рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ), рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ "рддреЗрдЬ" рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд╛рдлреА рдмрд┐рдЧрдбрд╝ рдЬрд╛рдПрдЧрд╛ред Validated рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдорд╛ рдЕрдкрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ:


рдирд┐рд╖реНрдХрд░реНрд╖


рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рдпреЛрдЧ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕реНрдЯреИрдХ рдХреЗ рдирд┐рд╢рд╛рди рд╡рд╛рд▓реЗ рдЕрдкрд╡рд╛рдж рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдзреАрдореЗ рд╣реИрдВ (100% рддреНрд░реБрдЯрд┐рдпрд╛рдВ 50 рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ Throw рдФрд░ Either рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╣реИрдВ!), рдФрд░ рдЬрдм рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИрдВ, рддреЛ ADT рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЗрд╕рдХреА рдХреАрдордд рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдмрд┐рдирд╛ рд╕реНрдЯреИрдХ рдЯреНрд░реИрд╕ рдХреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ ADT рдХреЗ рд░реВрдк рдореЗрдВ рддреЗрдЬрд╝ (рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдХрдо рдкреНрд░рддрд┐рд╢рдд рдХреЗ рд╕рд╛рде) рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдРрд╕реЗ рдЕрдкрд╡рд╛рдж рд╕рдорд╛рди рдорд╛рдиреНрдпрддрд╛ рд╕реЗ рдкрд░реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХреЗ рд╕реНрд░реЛрдд рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред


рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдпрджрд┐ рдЕрдкрд╡рд╛рдж рдХреА рд╕рдВрднрд╛рд╡рдирд╛ 1% рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд╕реНрдЯреИрдХ рдХреЗ рдмрд┐рдирд╛ рдЕрдкрд╡рд╛рдж рд╕рдмрд╕реЗ рддреЗрдЬрд╝реА рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, Validated рдпрд╛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ Either рд▓рдЧрднрдЧ рдЙрдкрд╡рд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИрдВред рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, рдЕрд╕рдлрд▓-рддреЗрдЬрд╝ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдХрд╛рд░рдг Either Validated рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рддреЗрдЬрд╝ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП ADT рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрд╡рд╛рджреЛрдВ рдкрд░ рдПрдХ рдФрд░ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: рддреНрд░реБрдЯрд┐ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╕реНрд╡рдпрдВ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╡рд╛рдпрд░реНрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдпрд╛рдж рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдирд▓ рдХреЗ рдмрдЬрд╛рдп Option рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордпред

Source: https://habr.com/ru/post/hi431586/


All Articles