{"id":2581,"date":"2015-09-12T01:41:49","date_gmt":"2015-09-12T01:41:49","guid":{"rendered":"http:\/\/www.garysieling.com\/blog\/?p=2581"},"modified":"2015-09-12T01:41:49","modified_gmt":"2015-09-12T01:41:49","slug":"scala-case-example","status":"publish","type":"post","link":"https:\/\/www.garysieling.com\/blog\/scala-case-example\/","title":{"rendered":"Scala case example"},"content":{"rendered":"<p>&#8220;Case&#8221; is used very frequently in Scala, as it is much more useful than other languages.<\/p>\n<p>For instance, you might wish to make a lambda that is defined only some of the time. This is convenient for writing tools to do ETL or scraping, where you don&#8217;t know how to handle some value, and aren&#8217;t sure if it will ever actually occur &#8211; you&#8217;ve defined that you know it could exist, but without actually handling it:<\/p>\n<pre lang=\"scala\">\nval y = (x: Int) => { \n  x match { \n     case 1 => \"test\" \n     case 2 => ???\n     case _ => ??? \n  } \n}\n<\/pre>\n<p>This is what the output looks like:<\/p>\n<pre>\ny: Int => String = <function1>\n\nscala> y(1)\nres8: String = test\n\nscala> y(2)\nscala.NotImplementedError: an implementation is missing\n  at scala.Predef$.$qmark$qmark$qmark(Predef.scala:225)\n  at $anonfun$1.apply(<console>:8)\n  at $anonfun$1.apply(<console>:8)\n  ... 33 elided\n\nscala> y(3)\nscala.NotImplementedError: an implementation is missing\n  at scala.Predef$.$qmark$qmark$qmark(Predef.scala:225)\n  at $anonfun$1.apply(<console>:8)\n  at $anonfun$1.apply(<console>:8)\n  ... 33 elided\n<\/pre>\n<p>Note how the ??? is actually a special operator, which causes &#8220;NotImplementedError&#8221; for &#8220;any&#8221; value (the _ matches whatever is left). <\/p>\n<p>Case can match on types:<\/p>\n<pre lang=\"Scala\">\n1 match { case _: Int => \"int\" }\n\nres18: String = int\n<\/pre>\n<p>And on regexes:<\/p>\n<pre lang=\"Scala\">\nval pattern = \"(\\\\d*)\".r\n\"1\" match { case pattern(x) => \"int\" }\n\nres31: String = int\n<\/pre>\n<p>The most common use case for &#8220;case&#8221; is unpacking lists of values. Usually these are &#8220;case classes&#8221;, which are similar to the concept of dictionary entries or enumeration types (except that a case class can hold data, like &#8220;Some&#8221; here holding a 1):<\/p>\n<pre lang=\"scala\">\nSome(1)\n  match { \n    case Some(x) => x \n    case _ => \"nothing\" \n  }\n\nres37: Any = 1\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;Case&#8221; is used very frequently in Scala, as it is much more useful than other languages. For instance, you might wish to make a lambda that is defined only some of the time. This is convenient for writing tools to do ETL or scraping, where you don&#8217;t know how to handle some value, and aren&#8217;t &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.garysieling.com\/blog\/scala-case-example\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Scala case example&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[4],"tags":[480,488],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/2581"}],"collection":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/comments?post=2581"}],"version-history":[{"count":0,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/2581\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/media?parent=2581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/categories?post=2581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/tags?post=2581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}