The flatMap method of the Success is implemented like this:
def flatMap[U](f: T => Try[U]): Try[U] =
try f(value)
catch {
case NonFatal(e) =&g
Without entering into monads, instead of thinking about it in terms of collections, you could think of it in terms of structures (where a collection becomes a structure with many entries).
Now, take a look at the signature of Try.flatmap
(from your post):
def flatMap[U](f: T => Try[U]): Try[U]
the function f
transforms T into a Try[U] in the context of Try[T].
In contrast, imagine the operation were 'map', the result would be:
def badMap[U](f: T => Try[U]): Try[Try[U]]
As you can see, flatmap is 'flattening' the result into the context of Try[T] and producing Try[U]
instead of the nested Try[Try[U]]
.
You can apply the same 'flattening of nested structure' concept to collections as you mention.