{"id":28039,"date":"2015-10-26T15:00:46","date_gmt":"2015-10-26T13:00:46","guid":{"rendered":"http:\/\/examples.javacodegeeks.com\/?p=28039"},"modified":"2019-03-29T14:27:34","modified_gmt":"2019-03-29T12:27:34","slug":"groovy-closure-example-2","status":"publish","type":"post","link":"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/","title":{"rendered":"Groovy Closure Example"},"content":{"rendered":"<h2>1. Introduction<\/h2>\n<p>A closure is an anonymous code block that can take arguments, return value, and also can be assigned to a variable. When it comes to Groovy, a closure can contain a variable scope defined outside of the closure expression. Groovy offers extended features to formal closure  definition.<\/p>\n<p>By using this features, we can write our code more dynamically by applying closures to functions as parameter, caling anonymous code blocks inside functions, etc&#8230;. Let&#8217;s see closure in action with supporting examples.<br \/>\n&nbsp;<br \/>\n&nbsp;\n<\/p>\n<h2>2. Closure Declaration<\/h2>\n<p><span style=\"text-decoration: underline\"><em>ClosureDeclaration.groovy<\/em><\/span><\/p>\n<pre class=\"brush:groovy\">package com.javacodegeeks.groovy.closure\n\nclass ClosureDeclaration {\n\n\tstatic main(args) {\n\t\tdef myClosure = { println \"Hello World!\" }\n\t\tmyClosure.call() \/\/ Hello World!\n\t\tmyClosure() \/\/ Hello World!\n\t}\n\n}\n<\/pre>\n<p>In this example, we have defined a closure on <code>line 06<\/code>,  and then we have called it by using <code>call()<\/code> function. Alternatively, you can call closures by acting as function directly as on <code>line 07<\/code><\/p>\n<h2>3. Closure Parameters<\/h2>\n<p>Sometimes, we need to pass arguments to the closures to make them more dynamically according to our needs. You can write a closure that accepts parameters while calling them. Let&#8217;s see following example to see how it works.<\/p>\n<p><span style=\"text-decoration: underline\"><em>ClosureParameters.groovy<\/em><\/span><\/p>\n<pre class=\"brush:groovy\">package com.javacodegeeks.groovy.closure\n\nclass ClosureParameters {\n\n\tstatic main(args) {\n\t\t\n\t\tdef squareWithImplicitParameter = { it * it }\n\t\tprintln squareWithImplicitParameter(4) \/\/ 16\n\t\t\n\t\tdef sumWithExplicitTypes = { int a, int b -&gt; return a + b }\n\t\tprintln sumWithExplicitTypes(11, 8) \/\/ 19\n\t\t\n\t\tdef sumWithOneExplicitOneOptionalTypes = { int a, b -&gt; return a + b }\n\t\tprintln sumWithOneExplicitOneOptionalTypes(20, 13) \/\/ 33\n\t\t\n\t\tdef sumWithDefaultParameterValue = { a, b = 5 -&gt; return a + b }\n\t\tprintln sumWithDefaultParameterValue(4)  \/\/ 9\n\t\t\n\t}\n\n}\n\n<\/pre>\n<p>On line 07, we have used implicit argument called <code>it<\/code> that defines default parameter provided to the closure. In square closure, we accessed the default parameter with <code>it<\/code>. Actually, it is equal to below code.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p><span style=\"text-decoration: underline\"><em>Square function without &#8220;it&#8221;<\/em><\/span><\/p>\n<pre class=\"brush:groovy\">def square = {x -&gt; x * x}\nprintln square(4)\n<\/pre>\n<p>And this function takes only one parameter and returns the multiplication of the same number. Remember that, the last line in the functions returned as default in Groovy language. In <code>ClosureParameters.groovy<\/code> class on <code>line 10<\/code>, we have defined closure with 2 parameters and both of them has explicit types that is <code>int<\/code>. In same way, it takes two arguments and returns sum of them. You do not need to provide explicit types, you can use optional types in arguments also. When you look at <code>line 13<\/code>, you will see that <code>a<\/code> has type <code>int<\/code>, but <code>b<\/code> don&#8217;t. Groovy closures also support default parameter values. On <code>line 16<\/code>, you need to provide first argument, but if you do not provide second parameter, it will be <code>5<\/code> as default.<\/p>\n<h2>4. VarArgs<\/h2>\n<p>You can define variable argument in closures for accepting dynamic arguments to closures. Let&#8217;s have a look at following example to see how it works<\/p>\n<p><span style=\"text-decoration: underline\"><em>ClosureVarArgs.groovy<\/em><\/span><\/p>\n<pre class=\"brush:groovy\">package com.javacodegeeks.groovy.closure\n\nclass ClosureVarArgs {\n\n\tstatic main(args) {\n\t\tdef combine = { String... names -&gt;\n\t\t\tnames.join(',') \n\t\t}\n\t\t\n\t\tprintln combine('John', 'Doe', 'Betty') \/\/ John,Doe,Betty\n\t}\n\n}\n<\/pre>\n<p>As you can see on <code>line 06<\/code>, we have defined a closure that takes variable arguments with <code>String... names<\/code> and we have joined them. Yes, you can also use array as one argument then join them, but this example is for showing how VarArgs can be used.[ulp id=&#8217;kHqyxwGNoyzYAfPN&#8217;]<\/p>\n<h2>5. Closure Passing<\/h2>\n<p>You can pass closure as parameter to another closure easily. Let&#8217;s look at following example.<\/p>\n<p><span style=\"text-decoration: underline\"><em>PassingClosure.groovy<\/em><\/span><\/p>\n<pre class=\"brush:groovy\">package com.javacodegeeks.groovy.closure\n\nclass PassingClosure {\n\n\tstatic main(args) {\n\t\tdef funcClosure = { x, func -&gt;\n\t\t\tfunc(x)\n\t\t}\n\t\t\n\t\tprintln funcClosure([1, 2, 3], { it.size()}) \/\/ 3\n\t}\n\n}\n<\/pre>\n<p>As you can see on <code>line 06<\/code> there are two closure parameter, but they are not just a parameter like <code>String<\/code> or <code>Integer<\/code>. When you look at the closure body, we are using <code>func(x)<\/code>. This means, <code>func<\/code> is an another closure that accepts closure expression. On <code>line 10<\/code>, <code>funcClosure([1, 2, 3], { it.size()})<\/code>, first parameter is a list and second parameter is a expression that uses it, and that means first parameter of the closure <code>funcClosure<\/code><\/p>\n<h2>6. Closure Composition<\/h2>\n<p>In Groovy, you can compose different closures to simulate <a href=\"https:\/\/en.wikipedia.org\/wiki\/Function_composition\" target=\"_blank\" rel=\"noopener noreferrer\">compound functions<\/a> in Math science. In this section, we will simulate <code>f(g(x)) = ...<\/code>. Let say that, you will sum two numbers and then you will apply square function to sum result. You can do that by following.<\/p>\n<p><span style=\"text-decoration: underline\"><em>PassingClosure.groovy<\/em><\/span><\/p>\n<pre class=\"brush:groovy\">package com.javacodegeeks.groovy.closure\n\nclass ClosureComposition {\n\n\tstatic main(args) {\n\t\t\n\t\tdef sum = { a, b -&gt; return a + b }\n\t\tdef square = { it * it }\n\t\tdef squareOfSum = square &lt;&lt; sum\n\t\t\n\t\tprintln squareOfSum(2, 3) \/\/ 25\n\t\t\n\t}\n\n}\n<\/pre>\n<p>On <code>line 07<\/code>, we defined sum closure and on <code>line 08<\/code> square function. On line 09, we pass sum function to square function and actually it turns into following.<\/p>\n<pre class=\"brush:groovy\">{ { a, b -&gt; return a + b } * { a, b -&gt; return a + b }}\n<\/pre>\n<h2>7. Conclusion<\/h2>\n<p>Closures helps us to define anonymous-like functions in program to use that closure as parameter or function body. We can directly call it by using call(), or we can use it as parameter to another closure or function.<\/p>\n<div class=\"download\"><strong>Download<\/strong><br \/>\nYou can download the full source code of this example as an &nbsp;Eclipse project here: <span style=\"font-weight: 400\"><strong><a href=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/10\/GroovyClosureExample.zip\" target=\"_blank\" rel=\"noopener noreferrer\">GroovyClosureExample<\/a><\/strong><\/span><\/div>\n","protected":false},"excerpt":{"rendered":"<p>1. Introduction A closure is an anonymous code block that can take arguments, return value, and also can be assigned to a variable. When it comes to Groovy, a closure can contain a variable scope defined outside of the closure expression. Groovy offers extended features to formal closure definition. By using this features, we can &hellip;<\/p>\n","protected":false},"author":56,"featured_media":24987,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1216],"tags":[1003],"class_list":["post-28039","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-groovy","tag-closure"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Groovy Closure Example - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"1. Introduction A closure is an anonymous code block that can take arguments, return value, and also can be assigned to a variable. When it comes to\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Groovy Closure Example - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"1. Introduction A closure is an anonymous code block that can take arguments, return value, and also can be assigned to a variable. When it comes to\" \/>\n<meta property=\"og:url\" content=\"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Examples Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2015-10-26T13:00:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-03-29T12:27:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/07\/groovy-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Huseyin Babal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@huseyinbabal\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Huseyin Babal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/\"},\"author\":{\"name\":\"Huseyin Babal\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/a64b2fa737b82194b7dfc39117f4a237\"},\"headline\":\"Groovy Closure Example\",\"datePublished\":\"2015-10-26T13:00:46+00:00\",\"dateModified\":\"2019-03-29T12:27:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/\"},\"wordCount\":601,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/07\/groovy-logo.jpg\",\"keywords\":[\"closure\"],\"articleSection\":[\"Groovy\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/\",\"url\":\"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/\",\"name\":\"Groovy Closure Example - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/07\/groovy-logo.jpg\",\"datePublished\":\"2015-10-26T13:00:46+00:00\",\"dateModified\":\"2019-03-29T12:27:34+00:00\",\"description\":\"1. Introduction A closure is an anonymous code block that can take arguments, return value, and also can be assigned to a variable. When it comes to\",\"breadcrumb\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/#primaryimage\",\"url\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/07\/groovy-logo.jpg\",\"contentUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/07\/groovy-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/examples.javacodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JVM Languages\",\"item\":\"https:\/\/examples.javacodegeeks.com\/category\/jvm-languages\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Groovy\",\"item\":\"https:\/\/examples.javacodegeeks.com\/category\/jvm-languages\/groovy\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Groovy Closure Example\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#website\",\"url\":\"https:\/\/examples.javacodegeeks.com\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Examples and Code Snippets\",\"publisher\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/examples.javacodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/examples.javacodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/javacodegeeks\",\"https:\/\/x.com\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/a64b2fa737b82194b7dfc39117f4a237\",\"name\":\"Huseyin Babal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/07\/Huseyin-Babal-96x96.jpg\",\"contentUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/07\/Huseyin-Babal-96x96.jpg\",\"caption\":\"Huseyin Babal\"},\"description\":\"Huseyin Babal has deep experience in Full Stack Development since 2007. He is mainly developing applications with JAVA, Spring, PHP, NodeJS, AngularJS. He is also interested in DevOps Engineering since 2013 and using AWS, Heroku for Cloud deployment and playing with Docker and Consul for implementing infinite scalable systems. He likes to share his experience in public conferences and perform advanced workshops about Full Stack Development and Devops. He is the author of NodeJS in Action course in Udemy.\",\"sameAs\":[\"http:\/\/huseyinbabal.net\",\"https:\/\/www.linkedin.com\/in\/huseyinbabal\",\"https:\/\/x.com\/huseyinbabal\"],\"url\":\"https:\/\/examples.javacodegeeks.com\/author\/huseyin-babal\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Groovy Closure Example - Java Code Geeks","description":"1. Introduction A closure is an anonymous code block that can take arguments, return value, and also can be assigned to a variable. When it comes to","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/","og_locale":"en_US","og_type":"article","og_title":"Groovy Closure Example - Java Code Geeks","og_description":"1. Introduction A closure is an anonymous code block that can take arguments, return value, and also can be assigned to a variable. When it comes to","og_url":"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/","og_site_name":"Examples Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2015-10-26T13:00:46+00:00","article_modified_time":"2019-03-29T12:27:34+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/07\/groovy-logo.jpg","type":"image\/jpeg"}],"author":"Huseyin Babal","twitter_card":"summary_large_image","twitter_creator":"@huseyinbabal","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Huseyin Babal","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/#article","isPartOf":{"@id":"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/"},"author":{"name":"Huseyin Babal","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/a64b2fa737b82194b7dfc39117f4a237"},"headline":"Groovy Closure Example","datePublished":"2015-10-26T13:00:46+00:00","dateModified":"2019-03-29T12:27:34+00:00","mainEntityOfPage":{"@id":"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/"},"wordCount":601,"commentCount":0,"publisher":{"@id":"https:\/\/examples.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/#primaryimage"},"thumbnailUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/07\/groovy-logo.jpg","keywords":["closure"],"articleSection":["Groovy"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/","url":"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/","name":"Groovy Closure Example - Java Code Geeks","isPartOf":{"@id":"https:\/\/examples.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/#primaryimage"},"image":{"@id":"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/#primaryimage"},"thumbnailUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/07\/groovy-logo.jpg","datePublished":"2015-10-26T13:00:46+00:00","dateModified":"2019-03-29T12:27:34+00:00","description":"1. Introduction A closure is an anonymous code block that can take arguments, return value, and also can be assigned to a variable. When it comes to","breadcrumb":{"@id":"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/#primaryimage","url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/07\/groovy-logo.jpg","contentUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/07\/groovy-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/examples.javacodegeeks.com\/jvm-languages\/groovy\/groovy-closure-example-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/examples.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"JVM Languages","item":"https:\/\/examples.javacodegeeks.com\/category\/jvm-languages\/"},{"@type":"ListItem","position":3,"name":"Groovy","item":"https:\/\/examples.javacodegeeks.com\/category\/jvm-languages\/groovy\/"},{"@type":"ListItem","position":4,"name":"Groovy Closure Example"}]},{"@type":"WebSite","@id":"https:\/\/examples.javacodegeeks.com\/#website","url":"https:\/\/examples.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Examples and Code Snippets","publisher":{"@id":"https:\/\/examples.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/examples.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/examples.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/examples.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/a64b2fa737b82194b7dfc39117f4a237","name":"Huseyin Babal","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/07\/Huseyin-Babal-96x96.jpg","contentUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/07\/Huseyin-Babal-96x96.jpg","caption":"Huseyin Babal"},"description":"Huseyin Babal has deep experience in Full Stack Development since 2007. He is mainly developing applications with JAVA, Spring, PHP, NodeJS, AngularJS. He is also interested in DevOps Engineering since 2013 and using AWS, Heroku for Cloud deployment and playing with Docker and Consul for implementing infinite scalable systems. He likes to share his experience in public conferences and perform advanced workshops about Full Stack Development and Devops. He is the author of NodeJS in Action course in Udemy.","sameAs":["http:\/\/huseyinbabal.net","https:\/\/www.linkedin.com\/in\/huseyinbabal","https:\/\/x.com\/huseyinbabal"],"url":"https:\/\/examples.javacodegeeks.com\/author\/huseyin-babal\/"}]}},"_links":{"self":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/28039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/users\/56"}],"replies":[{"embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=28039"}],"version-history":[{"count":0,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/28039\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/media\/24987"}],"wp:attachment":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=28039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=28039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=28039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}