Note: Because I am using Scala 2.7 we often need to use mkString to convert the processed string from a sequence of characters to a string. In scala 2.8 this is not required.
- /*
 -    Making use of raw strings to create a multi line string
 -    I add a | at the beginning of each line so that we can line up the quote nicely 
 -    in source code then later strip it from the string using stripMargin
 - */
 - scala> val quote = """|I don-t consider myself a pessimist.                                                                                                
 -      |                |I think of a pessimist as someone who is waiting for it to rain.
 -      |                |And I feel soaked to the skin.
 -      | 
 -      |                |Leonard Cohen"""
 - quote: java.lang.String = 
 - |I don-t consider myself a pessimist. 
 -                       |I think of a pessimist as someone who is waiting for it to rain.
 -                       |And I feel soaked to the skin.
 -        
 -                       |Leonard Cohen
 - // capilize the first character of each line
 - scala> val capitalized = quote.lines.
 -      |                         map( _.trim.capitalize).mkString("\n")
 - capitalized: String = 
 - |I don-t consider myself a pessimist.
 - |I think of a pessimist as someone who is waiting for it to rain.
 - |And I feel soaked to the skin.
 - |Leonard Cohen
 - // remove the margin of each line
 - scala> quote.stripMargin        
 - res1: String = 
 - I don-t consider myself a pessimist. 
 - I think of a pessimist as someone who is waiting for it to rain.
 - And I feel soaked to the skin.
 -        
 - Leonard Cohen
 - // this is silly.  I reverse the order of each word but keep the words in order
 - scala> quote.stripMargin.         
 -      |       lines.               
 -      |       map( _.split(" ").   
 -      |              map(_.reverse).
 -      |              mkString (" ")).
 -      |      mkString("\n")
 - res16: String = 
 - I t-nod redisnoc flesym a .tsimissep
 - I kniht fo a tsimissep sa enoemos ohw si gnitiaw rof ti ot .niar
 - dnA I leef dekaos ot eht .niks
 - dranoeL nehoC
 - scala> val myPatch = "-->This is my patch<--"                
 - myPatch: java.lang.String = -->This is my patch<--
 - // I replace the characters from point 10 in the string to myPatch.length 
 - // (the full patch string)
 - scala> quote.patch(10, myPatch, myPatch.length).mkString     
 - res21: String = 
 - |I don-t c-->This is my patch<--mist.
 -                       |I think of a pessimist as someone who is waiting for it to rain.
 -                       |And I feel soaked to the skin.
 -        
 -                       |Leonard Cohen
 - // drop the first 3 lines of the string.  
 - // there is also a take method
 - scala> quote.lines.drop(3).mkString("\n").stripMargin 
 - res25: String = 
 -        
 - Leonard Cohen
 - // a bunch of examples of converting strings
 - scala> "1024".toInt
 - res26: Int = 1024
 - scala> "1024".toFloat
 - res27: Float = 1024.0
 - scala> "1024".toDouble
 - res28: Double = 1024.0
 - scala> "1024".toLong  
 - res29: Long = 1024
 - scala> "102".toByte 
 - res31: Byte = 102
 - scala> "true".toBoolean
 - res32: Boolean = true
 - // format uses the java.util.Formatter class to format a string
 - scala> "Hello %s,\nThe date is %2$tm %2$te,%2$tY".format("Jesse", new java.util.Date()) 
 - res35: String = 
 - Hello Jesse,
 - The date is 09 30,2009
 - /*
 -    More silliness
 -    I am replacing every other character with the character of the reversed string
 -   
 -    this is done by 
 -    1. convert string to a list and zip it together with its reverse
 -       We may still need to cover zipping.  It basically matches up the 
 -       corresponding elements of two lists into one list
 -       so 1,2,3 and one,two,three zipped would be (1,one),(2,two),(3,three)
 -    2. Add an index to each element in the list with zipWithIndex
 -    3. Use map to check if the element is an odd element using the index and return either the original element or the reversed element
 -   
 -    Not useful but interesting use of functional idioms
 - */
 - scala> quote.toList.                                          
 -      |       zip(quote.reverse.toList).                       
 -      |       zipWithIndex.                                    
 -      |       map {                                            
 -      |            case ((original,reversed),index) if(index % 2 == 0) => original
 -      |            case ((original,reversed),index) => reversed                   
 -      |           }.                                                              
 -      |       mkString                                                            
 - res42: String = |e oo -r noes|d r m s l     e s m s .        . i s e t o   e|a shlne  f anp|s i i t a   o e n   h  .siwrioi gifrrfig ioirwis.  h   n e o   a t i i s|pna f  enlhs a|e   o t e s i .        . s m s e     l s m r d|seon r- oo e|
 - // filter out all non-vowels
 - scala> quote.filter( "aeiou" contains _ ).mkString
 - res51: String = ooieeaeiiioaeiiaoeoeoiaiioioaieeoaeoeieoaoe
 
Note that mkString is rather inefficient.
ReplyDeleteIt cannot preallocate the buffer, because it's a very generic implementation.
See the recent discussion on the Scala mailing list