Chapter 8. for Comprehensions in Depth
“for Comprehensions” described the syntax for for
comprehensions, including lots of examples. At this point, they look like a nice, more flexible version of the venerable for
loop, but not much more. In fact, lots of sophistication lies below the surface. This chapter explores how for
comprehension syntax is a more concise way to use foreach
, map
, flatMap
, and withFilter
, some of the functional combinators we discussed in the previous chapter. You can write concise code with elegant solutions to a number of design problems.
We’ll finish with some practical design problems implemented using for
comprehensions, such as error handling during the execution of a sequence of processing steps.
Recap: The Elements of for Comprehensions
A for
comprehension contains one or more generator expressions, optional guard expressions for filtering, and optional value definitions. The output can be yielded to create a new collection, or a side-effecting block of code can be executed on each pass, such as printing output. The following example demonstrates all these features. It removes blank lines from a text file. This is a full program with an example of how to parse input arguments (although there are libraries available for this purpose), handle help messages, etc.:
// src/main/scala/progscala3/forcomps/RemoveBlanks.scala
package
progscala3
.
forcomps
object
RemoveBlanks
:
def
apply
(
path
:
String
,
compress
:
Boolean
,
numbers
:
Boolean
)
:
Seq
[
String
]
=
for
Get Programming Scala, 3rd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.