If the underlying type of each optional field is the same, you could write:
List(("Instructions", a.instructions),
("Terms and Conditions", a.terms_and_conditions),
("Cancellation Addendum", a.cancellation_addendum)
).collect {
case (desc, Some(x)) => new Description(desc, x)
}
By the way, the original code won't "drop the None values on the floor"; it should be compiling with a non-exhaustive match warning, and will fail at runtime with a MatchError
.