Earlier quoted context omitted.
"Combining for-comprehensions with composable futures makes asynchronous concurrency look like straightforward synchronous code." I would really enjoy seeing this in Java.
I'd like to see the Scala code too. I've played with both and in the end, both codes are pretty complex, just complex in different ways. It's a complex problem with a lot of edge cases and tricky error cases that need to be handled properly, which is where the elegance of the language or the programming paradigm usually goes down the drain. I'd like to see a fully functional snippet of code that gracefully handles er…
val fNotifications: Future[List[Notification]] = // get notifications from the database
val fPosts: Future[List[Post]] = // get posts from a different database
// If getting notifications fail, log the error and pretend there are no notifications
val safeNotifications = fNotifications rescue { t: Throwable => log.error(t); Future(Nil) }
// If getting posts fails, log the error and try retrieving stale posts from the cached post server
val safePosts = fPosts rescue { t: Throwable =>
log.error(t)
// If the cached post server fails too, just pretend there are no posts
cachedPostsDatabase.getForCurrentUser rescue { t: Throwable => log.error(t); Future(Nil) }
}
val facebookPage: Future[Page] = for {
notifications: List[Notification]
is a thumbnail sketch of how you'd implement the facebook timeline in Scala if you were doing so. There are even better abstractions that I've started using (functional reactive programming specifically) but none of them come with the standard library, so I thought that was a bit unfair.