tag:blogger.com,1999:blog-62436706230105022522024-03-13T18:23:35.977+00:00Remove duplications and fix bad names<i>
New ideas pass through three periods:
<br>
1) It can’t be done.
<br>
2) It probably can be done, but it’s not worth doing.
<br>
3) I knew it was a good idea all along!
<br>
</i>
- Arthur C. ClarkeUnknownnoreply@blogger.comBlogger51125tag:blogger.com,1999:blog-6243670623010502252.post-29426979756637005892015-09-24T14:57:00.000+01:002015-09-24T20:38:05.911+01:00Types of Testing<div class="p1">
<span class="s1">There are many types of tests, the following is an opinionated short list of them:</span></div>
<div class="p2">
<br /></div>
<h3>
1) UNIT TESTS</h3>
<div class="p2">
<br /></div>
<div class="p1">
Unit tests are very very very important.</div>
<div class="p2">
<span class="s1"><i></i></span><br /></div>
<div class="p2">
<span class="s1">They tell the developer immediately where he is wrong and also they will defend the code against unwanted changes and bugs in the future, like many small powerful soldiers.</span></div>
<div class="p2">
<span class="s1"><br /></span></div>
<div class="p2">
<span class="s1"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-fHlqkI6FqdE/VgP6seAj1HI/AAAAAAAAGg4/zz3nop5OZuA/s1600/Remco%2BGIs%2B1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="124" src="http://4.bp.blogspot.com/-fHlqkI6FqdE/VgP6seAj1HI/AAAAAAAAGg4/zz3nop5OZuA/s200/Remco%2BGIs%2B1.jpg" width="200" /></a></div>
<div class="p2">
<span class="s1"><i></i></span><br /></div>
<div class="p2">
<br /></div>
<h3>
2) ACCEPTANCE TESTS</h3>
<div class="p1">
<br /></div>
<div class="p1">
<span class="s1">Acceptance test are also very important because they are defined by or with the product owners and they contain the actual functionality expected from the business.</span></div>
<div class="p1">
<span class="s1"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-h9AO9ztKAXk/VgP7TbKEaHI/AAAAAAAAGhA/Bu8pNs54mwM/s1600/Making-Money-Online.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="241" src="http://2.bp.blogspot.com/-h9AO9ztKAXk/VgP7TbKEaHI/AAAAAAAAGhA/Bu8pNs54mwM/s320/Making-Money-Online.jpg" width="320" /></a></div>
<div class="p1">
<span class="s1"><br /></span></div>
<div class="p2">
<span class="s1"><i></i></span><br /></div>
<div class="p2">
<span class="s1"><i></i></span><br /></div>
<div class="p3">
<span class="s1"></span><br /></div>
<h3>
<span class="s1">3) INTEGRATION TESTS</span></h3>
<div class="p1">
<span class="s1"><br /></span></div>
<div class="p1">
<span class="s1">Integration tests are less important, but still important. They are there to test “happy paths” and make sure communication between components is fine. </span>Communication NOT functionality!</div>
<div class="p1">
They are difficult to maintain, to mock, to extends. Slow to run. Hard to understand. They corrupt code coverage. They give big false positive thinking. </div>
<div class="p1">
<br /></div>
<div class="p1">
I know what you are thinking.....<span style="background-color: white;"><a href="https://www.ima.umn.edu/~arnold/disasters/ariane5rep.html" target="_blank">the maiden flight of the Ariane 5 launcher failure</a>, still</span> I'm not a big fan of these.</div>
<div class="p1">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-b68U4vxAfdU/VgP-up3ocEI/AAAAAAAAGhM/MYDf5SXCMco/s1600/Russian-Rocket-Failure--124448.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="219" src="http://4.bp.blogspot.com/-b68U4vxAfdU/VgP-up3ocEI/AAAAAAAAGhM/MYDf5SXCMco/s320/Russian-Rocket-Failure--124448.jpg" width="320" /></a></div>
<div class="p1">
<br /></div>
<div class="p2">
<span class="s1"><i></i></span><br /></div>
<div class="p2">
<br /></div>
<h3>
<span class="s1">4) PERFORMANCE & STRESS TESTS</span></h3>
<div class="p2">
<br /></div>
<div class="p1">
<span class="s1">Performance and stress tests are important, as you can imagine they test your software under extreme circumstances. They tell you if you met the product owner expectations in terms of SLA and Throughput, and they tell you also if you introduced some kind of nasty bottleneck before going to production. </span></div>
<div class="p1">
<span class="s1"><br /></span></div>
<div class="p1">
<span class="s1">Keep them simple, automate them, and run them against a production-like environment. </span></div>
<div class="p1">
<span class="s1"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-h5FDds58rGA/VgQADD66IzI/AAAAAAAAGhY/-DhKk5OBDGo/s1600/11654793-car-speed-meter.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-h5FDds58rGA/VgQADD66IzI/AAAAAAAAGhY/-DhKk5OBDGo/s320/11654793-car-speed-meter.jpg" width="319" /></a></div>
<div class="p1">
<span class="s1"><br /></span></div>
<div class="p1">
<span class="s1"><br /></span></div>
<div class="p2">
<br /></div>
<h3>
5) MANUAL UAT TESTS </h3>
<br />
<div class="p1">
<span class="s1"><br /></span></div>
<div class="p1">
<span class="s1">And finally manual UAT tests, that are normally run by product owners to verify that everything is cool and ready to make the business rich.</span></div>
<div class="p1">
<span class="s1"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-2GnDLqxehKE/VgQAj1hzC9I/AAAAAAAAGhg/xwRy6MjvNI4/s1600/bigstock-Happy-businessman-standing-on-12165197.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="http://1.bp.blogspot.com/-2GnDLqxehKE/VgQAj1hzC9I/AAAAAAAAGhg/xwRy6MjvNI4/s320/bigstock-Happy-businessman-standing-on-12165197.jpg" width="320" /></a></div>
<div class="p1">
<span class="s1"><br /></span></div>
<div class="p1">
<span class="s1"><br /></span></div>
<div class="p1">
<span class="s1"><br /></span></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-67150383823025629532015-07-08T15:21:00.000+01:002015-07-08T15:27:54.291+01:00CompletableFuture VS ParallelStream<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-AlOf1rUKRZo/VZ0zX1R4uYI/AAAAAAAAFdc/3A23BvSKCt8/s1600/logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="182" src="http://3.bp.blogspot.com/-AlOf1rUKRZo/VZ0zX1R4uYI/AAAAAAAAFdc/3A23BvSKCt8/s320/logo.png" width="320" /></a></div>
CompletableFuture can be a complex concept if taken by itself, so I will use a simple example here to show for one business requirement, how to use it, when to use it and what is the difference comparing to parallelStream.<br />
<br />
The requirement is as follows :<br />
<br />
Build a list of promotion Strings. For each one you need to send an email to all the customers with the promotion. You also need to send an email to the Boss saying that promotions have been applied today.<br />
<br />
The boss email and the customers emails are independent to each others and should not wait on either completion.<br />
<br />
The base algorithm is this one :<br />
<br />
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> InterruptedException <span style="color: #333333;">{</span>
List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> promotions <span style="color: #333333;">=</span> Arrays<span style="color: #333333;">.</span><span style="color: #0000cc;">asList</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Pizza Discount : "</span><span style="color: #333333;">,</span></pre>
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;"> </span> <span style="background-color: #fff0f0;">"Beer Discount : "</span><span style="color: #333333;">,</span> <span style="background-color: #fff0f0;"> </span></pre>
<pre style="line-height: 125%; margin: 0;"><span style="background-color: #fff0f0;"> "Coke Discount : "</span><span style="color: #333333;">,</span> </pre>
<pre style="line-height: 125%; margin: 0;"><span style="background-color: #fff0f0;"> "Service Discount : "</span><span style="color: #333333;">);</span>
old<span style="color: #333333;">(</span>promotions<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">old</span><span style="color: #333333;">(</span>List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> promotions<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span>String promotion <span style="color: #333333;">:</span> promotions<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
promotion <span style="color: #333333;">=</span> promotion <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">"30%"</span><span style="color: #333333;">;</span>
promotion <span style="color: #333333;">=</span> promotion <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" Valid only Today"</span><span style="color: #333333;">;</span>
sendEmailToCustomers<span style="color: #333333;">(</span>promotion<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
sendEmailToTheBoss<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Today discount was 30%"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span></pre>
<br />
<br />
<br />
Let assume that sending an email takes 1 second :<br />
<br />
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">sendEmailToCustomers</span><span style="color: #333333;">(</span>String promotion<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">try</span> <span style="color: #333333;">{</span>
Thread<span style="color: #333333;">.</span><span style="color: #0000cc;">sleep</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1000</span><span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Email sent to customer for promotion : "</span> <span style="color: #333333;">+</span> promotion<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span> <span style="color: #008800; font-weight: bold;">catch</span> <span style="color: #333333;">(</span>InterruptedException e<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">sendEmailToTheBoss</span><span style="color: #333333;">(</span>String promotion<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">try</span> <span style="color: #333333;">{</span>
Thread<span style="color: #333333;">.</span><span style="color: #0000cc;">sleep</span><span style="color: #333333;">(</span><span style="color: #0000dd; font-weight: bold;">1000</span><span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Email sent to Boss for promotion : "</span> <span style="color: #333333;">+</span> promotion<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span> <span style="color: #008800; font-weight: bold;">catch</span> <span style="color: #333333;">(</span>InterruptedException e<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span> </pre>
<pre style="line-height: 125%; margin: 0;"> </pre>
For each promotion we add the discount percentage. Then we add the day of when the discount is valid. Lastly we send the emails to all the customers. At the end we send the email to the Boss.<br />
<br />
We can improve the speed of the algorithm parallelizing the process of sending emails to the customers using parallelStream :<br />
<br />
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">ps</span><span style="color: #333333;">(</span>List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> promotions<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> InterruptedException <span style="color: #333333;">{</span>
promotions<span style="color: #333333;">.</span><span style="color: #0000cc;">parallelStream</span><span style="color: #333333;">()</span></pre>
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;"> .</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>promotion <span style="color: #333333;">-></span> promotion <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">"30%"</span><span style="color: #333333;">)</span></pre>
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;"> .</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>promotion <span style="color: #333333;">-></span> promotion <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" Valid only Today"</span><span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>promotion <span style="color: #333333;">-></span> sendEmailToCustomers<span style="color: #333333;">(</span>promotion<span style="color: #333333;">));</span> </pre>
<pre style="line-height: 125%; margin: 0;"> </pre>
<pre style="line-height: 125%; margin: 0;"> sendEmailToTheBoss<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Today discount was 30%"</span><span style="color: #333333;">);</span>
<span style="color: #333333;">}</span></pre>
<br />
Fantastic, now the promotions are sent in parallel, so it will take much less.<br />
<br />
But we still have a requirement to fulfill, customers and Boss don't want to wait on each other to receive their emails.<br />
<br />
Here the CompletableFuture comes in handy :<br />
<br />
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">cf</span><span style="color: #333333;">(</span>List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> promotions<span style="color: #333333;">)</span> <span style="color: #008800; font-weight: bold;">throws</span> InterruptedException <span style="color: #333333;">{</span>
CompletableFuture<span style="color: #333333;">[]</span> futures <span style="color: #333333;">=</span> promotions<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">()</span></pre>
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;"> .</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>promotion <span style="color: #333333;">-></span> CompletableFuture<span style="color: #333333;">.</span><span style="color: #0000cc;">supplyAsync</span><span style="color: #333333;">(()</span> <span style="color: #333333;">-></span> promotion <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">"30%"</span><span style="color: #333333;">))</span>
<span style="color: #333333;"> .</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>future <span style="color: #333333;">-></span> future<span style="color: #333333;">.</span><span style="color: #0000cc;">thenApply</span><span style="color: #333333;"><span style="color: #0000cc;">Async</span>((</span>promotion<span style="color: #333333;">)</span> <span style="color: #333333;">-></span> promotion <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" Valid only Today"</span><span style="color: #333333;">))</span></pre>
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;"> .</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>future <span style="color: #333333;">-></span> future<span style="color: #333333;">.</span><span style="color: #0000cc;">thenAcceptAsync</span><span style="color: #333333;">(</span>promotion <span style="color: #333333;">-></span> <span style="color: #333333;">{</span>
sendEmailToCustomers<span style="color: #333333;">((</span>String<span style="color: #333333;">)</span> promotion<span style="color: #333333;">);</span>
<span style="color: #333333;"> }))</span></pre>
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;"> .</span><span style="color: #0000cc;">toArray</span><span style="color: #333333;">(</span>CompletableFuture<span style="color: #333333;">[]::</span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #333333;">);</span>
sendEmailToTheBoss<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Today discount was 30%"</span><span style="color: #333333;">);</span>
CompletableFuture<span style="color: #333333;">.</span><span style="color: #0000cc;">allOf</span><span style="color: #333333;">(</span>futures<span style="color: #333333;">).</span><span style="color: #0000cc;">join</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
</pre>
<br />
We composed our completableFutures based on the steps necessary to build the promotion.<br />
The last step of the chain is to send the emails to the customers.<br />
<br />
Everything is asynchronous here and CompletableFuture[] futures holds the composed completableFutures.<br />
When the jvm rich the line <i>sendEmailToTheBoss<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Today discount was 30%"</span></i><span style="color: #333333;"><i>);</i> </span>, some of the customers email will be already sent and some are still to be sent, but we don't care to wait, we just want to acknowledge our Boss that promotions were generated.<br />
<br />
The last line <i>CompletableFuture<span style="color: #333333;">.</span><span style="color: #0000cc;">allOf</span><span style="color: #333333;">(</span>futures<span style="color: #333333;">).</span><span style="color: #0000cc;">join</span><span style="color: #333333;">(); </span></i>is because before leaving this method we want to wait for all the emails to be sent to the customers.<br />
<br />
So, running all the methods above :<br />
<br />
<pre style="line-height: 125%; margin: 0;">System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"-------OLD-------"</span><span style="color: #333333;">);</span>
old<span style="color: #333333;">(</span>promotions<span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"-------PARALLEL STREAM-------"</span><span style="color: #333333;">);</span>
ps<span style="color: #333333;">(</span>promotions<span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"-------COMPLETABLE FUTURE-------"</span><span style="color: #333333;">);</span>
cf<span style="color: #333333;">(</span>promotions<span style="color: #333333;">);</span>
</pre>
<br />
The output will be<br />
<br />
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;">-------</span>OLD<span style="color: #333333;">-------</span>
Email sent to customer <span style="color: #008800; font-weight: bold;">for</span> promotion <span style="color: #333333;">:</span> Pizza Discount <span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">30</span><span style="color: #333333;">%</span> Valid only Today
Email sent to customer <span style="color: #008800; font-weight: bold;">for</span> promotion <span style="color: #333333;">:</span> Beer Discount <span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">30</span><span style="color: #333333;">%</span> Valid only Today
Email sent to customer <span style="color: #008800; font-weight: bold;">for</span> promotion <span style="color: #333333;">:</span> Coke Discount <span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">30</span><span style="color: #333333;">%</span> Valid only Today
Email sent to customer <span style="color: #008800; font-weight: bold;">for</span> promotion <span style="color: #333333;">:</span> Service Discount <span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">30</span><span style="color: #333333;">%</span> Valid only Today
Email sent to Boss <span style="color: #008800; font-weight: bold;">for</span> promotion <span style="color: #333333;">:</span> Today discount was <span style="color: #0000dd; font-weight: bold;">30</span><span style="color: #333333;">%</span>
<span style="color: #333333;">-------</span>PARALLEL STREAM<span style="color: #333333;">-------</span>
Email sent to customer <span style="color: #008800; font-weight: bold;">for</span> promotion <span style="color: #333333;">:</span> Service Discount <span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">30</span><span style="color: #333333;">%</span> Valid only Today
Email sent to customer <span style="color: #008800; font-weight: bold;">for</span> promotion <span style="color: #333333;">:</span> Coke Discount <span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">30</span><span style="color: #333333;">%</span> Valid only Today
Email sent to customer <span style="color: #008800; font-weight: bold;">for</span> promotion <span style="color: #333333;">:</span> Beer Discount <span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">30</span><span style="color: #333333;">%</span> Valid only Today
Email sent to customer <span style="color: #008800; font-weight: bold;">for</span> promotion <span style="color: #333333;">:</span> Pizza Discount <span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">30</span><span style="color: #333333;">%</span> Valid only Today
Email sent to Boss <span style="color: #008800; font-weight: bold;">for</span> promotion <span style="color: #333333;">:</span> Today discount was <span style="color: #0000dd; font-weight: bold;">30</span><span style="color: #333333;">%</span>
<span style="color: #333333;">-------</span>COMPLETABLE FUTURE<span style="color: #333333;">-------</span>
Email sent to customer <span style="color: #008800; font-weight: bold;">for</span> promotion <span style="color: #333333;">:</span> Pizza Discount <span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">30</span><span style="color: #333333;">%</span> Valid only Today
Email sent to customer <span style="color: #008800; font-weight: bold;">for</span> promotion <span style="color: #333333;">:</span> Beer Discount <span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">30</span><span style="color: #333333;">%</span> Valid only Today
Email sent to Boss <span style="color: #008800; font-weight: bold;">for</span> promotion <span style="color: #333333;">:</span> Today discount was <span style="color: #0000dd; font-weight: bold;">30</span><span style="color: #333333;">%</span>
Email sent to customer <span style="color: #008800; font-weight: bold;">for</span> promotion <span style="color: #333333;">:</span> Coke Discount <span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">30</span><span style="color: #333333;">%</span> Valid only Today
Email sent to customer <span style="color: #008800; font-weight: bold;">for</span> promotion <span style="color: #333333;">:</span> Service Discount <span style="color: #333333;">:</span> <span style="color: #0000dd; font-weight: bold;">30</span><span style="color: #333333;">%</span> Valid only Today</pre>
<br />
<br />
<br />
<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-31747284164057297052015-06-25T12:07:00.000+01:002015-06-26T09:34:03.954+01:00Strategy Pattern in Java 8These are two examples on how to implement a <a href="https://en.wikipedia.org/?title=Strategy_pattern" target="_blank">Strategy pattern design</a> using Java 8 functional style together with <a href="https://github.com/aol/cyclops/tree/master/cyclops-pattern-matching" target="_blank">Cyclops pattern matching</a> and <a href="https://github.com/hamcrest" target="_blank">Hamcrest</a> libraries.<br />
<br />
PrintDependingOnInput method is a strategy that will System.println some message based on the log passed.<br />
<br />
AddPrefix is another strategy that will add a prefix to a message based on the message content.<br />
<br />
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">marco</span><span style="color: #333333;">.</span><span style="color: #0000cc;">patternmatching</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">static</span> org<span style="color: #333333;">.</span><span style="color: #0000cc;">hamcrest</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Matchers</span><span style="color: #333333;">.</span><span style="color: #0000cc;">containsString</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">static</span> org<span style="color: #333333;">.</span><span style="color: #0000cc;">hamcrest</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Matchers</span><span style="color: #333333;">.</span><span style="color: #0000cc;">not</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">static</span> org<span style="color: #333333;">.</span><span style="color: #0000cc;">hamcrest</span><span style="color: #333333;">.</span><span style="color: #0000cc;">Matchers</span><span style="color: #333333;">.</span><span style="color: #0000cc;">startsWith</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">static</span> org<span style="color: #333333;">.</span><span style="color: #0000cc;">hamcrest</span><span style="color: #333333;">.</span><span style="color: #0000cc;">core</span><span style="color: #333333;">.</span><span style="color: #0000cc;">AllOf</span><span style="color: #333333;">.</span><span style="color: #0000cc;">allOf</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.ArrayList</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.aol.cyclops.matcher.builders.Matching</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">FunctionalStrategy</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> toTest <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ArrayList<span style="color: #333333;"><>();</span>
toTest<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"INFO everything is fine"</span><span style="color: #333333;">);</span>
toTest<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"WARN something weird happened"</span><span style="color: #333333;">);</span>
toTest<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"ERROR NullPointerException"</span><span style="color: #333333;">);</span>
toTest<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"ERROR IOException"</span><span style="color: #333333;">);</span>
toTest<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">FunctionalStrategy:</span><span style="color: #333333;">:</span>printDependingOnInput<span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"--------------------"</span><span style="color: #333333;">);</span>
List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> messages <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ArrayList<span style="color: #333333;"><>();</span>
messages<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"everything is fine"</span><span style="color: #333333;">);</span>
messages<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"something weird happened"</span><span style="color: #333333;">);</span>
messages<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"NullPointerException"</span><span style="color: #333333;">);</span>
messages<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"IOException"</span><span style="color: #333333;">);</span>
messages<span style="color: #333333;">.</span><span style="color: #0000cc;">stream</span><span style="color: #333333;">().</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span><span style="color: #997700; font-weight: bold;">FunctionalStrategy:</span><span style="color: #333333;">:</span>addPrefix<span style="color: #333333;">).</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">printDependingOnInput</span><span style="color: #333333;">(</span>String log<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
Matching
<span style="color: #333333;">.</span><span style="color: #0000cc;">when</span><span style="color: #333333;">().</span><span style="color: #0000cc;">isMatch</span><span style="color: #333333;">(</span>startsWith<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"INFO"</span><span style="color: #333333;">))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">thenConsume</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">when</span><span style="color: #333333;">().</span><span style="color: #0000cc;">isMatch</span><span style="color: #333333;">(</span>startsWith<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"WARN"</span><span style="color: #333333;">))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">thenConsume</span><span style="color: #333333;">(</span>message <span style="color: #333333;">-></span> System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Found one warning : "</span> <span style="color: #333333;">+</span> message<span style="color: #333333;">))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">when</span><span style="color: #333333;">().</span><span style="color: #0000cc;">isMatch</span><span style="color: #333333;">(</span>allOf<span style="color: #333333;">(</span>startsWith<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"ERROR"</span><span style="color: #333333;">),</span> containsString<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"NullPointerException"</span><span style="color: #333333;">)))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">thenConsume</span><span style="color: #333333;">(</span>message <span style="color: #333333;">-></span> System<span style="color: #333333;">.</span><span style="color: #0000cc;">err</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>message<span style="color: #333333;">))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">when</span><span style="color: #333333;">().</span><span style="color: #0000cc;">isMatch</span><span style="color: #333333;">(</span>allOf<span style="color: #333333;">(</span>startsWith<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"ERROR"</span><span style="color: #333333;">),</span> containsString<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"IOException"</span><span style="color: #333333;">)))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">thenConsume</span><span style="color: #333333;">(</span>message <span style="color: #333333;">-></span> System<span style="color: #333333;">.</span><span style="color: #0000cc;">err</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>message <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" Retrying a couple of times"</span><span style="color: #333333;">))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">match</span><span style="color: #333333;">(</span>log<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> String <span style="color: #0066bb; font-weight: bold;">addPrefix</span><span style="color: #333333;">(</span>String log<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">return</span> Matching
<span style="color: #333333;">.</span><span style="color: #0000cc;">when</span><span style="color: #333333;">().</span><span style="color: #0000cc;">isMatch</span><span style="color: #333333;">(</span>allOf<span style="color: #333333;">(</span>not<span style="color: #333333;">(</span>containsString<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Exception"</span><span style="color: #333333;">)),</span> not<span style="color: #333333;">(</span>containsString<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"weird"</span><span style="color: #333333;">))))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">thenApply</span><span style="color: #333333;">(</span>message <span style="color: #333333;">-></span> <span style="background-color: #fff0f0;">"INFO "</span> <span style="color: #333333;">+</span> message<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">when</span><span style="color: #333333;">().</span><span style="color: #0000cc;">isMatch</span><span style="color: #333333;">(</span>containsString<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"weird"</span><span style="color: #333333;">))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">thenApply</span><span style="color: #333333;">(</span>message <span style="color: #333333;">-></span> <span style="background-color: #fff0f0;">"WARN "</span> <span style="color: #333333;">+</span> message<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">when</span><span style="color: #333333;">().</span><span style="color: #0000cc;">isMatch</span><span style="color: #333333;">(</span>containsString<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Exception"</span><span style="color: #333333;">))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">thenApply</span><span style="color: #333333;">(</span>message <span style="color: #333333;">-></span> <span style="background-color: #fff0f0;">"ERROR "</span> <span style="color: #333333;">+</span> message<span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">match</span><span style="color: #333333;">(</span>log<span style="color: #333333;">).</span><span style="color: #0000cc;">get</span><span style="color: #333333;">();</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
</pre>
<br /><br />
Nice and clean ;)<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-16443139240238432692015-06-16T11:34:00.003+01:002015-06-26T09:35:23.389+01:00Java 8 and how Optional removes the need for == nullI was confused initially when the Optional concept entered the Java world.<br />
I was wondering how the hell can Optional remove the need to check for null? At some point I will need to use optional.isPresent() before using whatever is inside. So what's the point to replace == null with isPresent()?<br />
<br />
<br />
The main concept to keep in mind is that Optional is a monad and as a monad contains map(), flatmap(), filter() and other methods that can be used directly against the optional instance.<br />
<br />
<br />
Here, with the following simple code, I hope I will clarify a bit more the power of java.util.Optional. <br />
<br />
In this example we have a list of logs and we want to apply 3 different operations based on the the type of log (INFO, ERROR, WARN).<br />
<br />
<br />
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">marco</span><span style="color: #333333;">.</span><span style="color: #0000cc;">optional</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.ArrayList</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.Optional</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">TestOptional</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
List<span style="color: #333333;"><</span>Optional<span style="color: #333333;"><</span>String<span style="color: #333333;">>></span> logs <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ArrayList<span style="color: #333333;"><</span>Optional<span style="color: #333333;"><</span>String<span style="color: #333333;">>>();</span>
logs<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>Optional<span style="color: #333333;">.</span><span style="color: #0000cc;">ofNullable</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"INFO:: some info here 1"</span><span style="color: #333333;">));</span>
logs<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>Optional<span style="color: #333333;">.</span><span style="color: #0000cc;">ofNullable</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"INFO:: some info here 2"</span><span style="color: #333333;">));</span>
logs<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>Optional<span style="color: #333333;">.</span><span style="color: #0000cc;">ofNullable</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"ERROR:: some error here 3"</span><span style="color: #333333;">));</span>
logs<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>Optional<span style="color: #333333;">.</span><span style="color: #0000cc;">ofNullable</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"INFO:: some info here 4"</span><span style="color: #333333;">));</span>
logs<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>Optional<span style="color: #333333;">.</span><span style="color: #0000cc;">ofNullable</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"WARN:: some info here 5"</span><span style="color: #333333;">));</span>
logs<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>Optional<span style="color: #333333;">.</span><span style="color: #0000cc;">ofNullable</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">null</span><span style="color: #333333;">));</span>
logs<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>Optional<span style="color: #333333;">.</span><span style="color: #0000cc;">ofNullable</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"INFO:: some info here 7"</span><span style="color: #333333;">));</span>
logs<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span>Optional<span style="color: #333333;">.</span><span style="color: #0000cc;">ofNullable</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"WARN:: some info here 8"</span><span style="color: #333333;">));</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span>Optional<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> singleLog <span style="color: #333333;">:</span> logs<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
printErrors<span style="color: #333333;">(</span>singleLog<span style="color: #333333;">);</span>
printInfos<span style="color: #333333;">(</span>singleLog<span style="color: #333333;">);</span>
printWarnOnlyNumber<span style="color: #333333;">(</span>singleLog<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">printErrors</span><span style="color: #333333;">(</span>Optional<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> singleLog<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
singleLog<span style="color: #333333;">.</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span>entry <span style="color: #333333;">-></span> entry<span style="color: #333333;">.</span><span style="color: #0000cc;">startsWith</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"ERROR"</span><span style="color: #333333;">)).</span><span style="color: #0000cc;">ifPresent</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">printInfos</span><span style="color: #333333;">(</span>Optional<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> singleLog<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
singleLog<span style="color: #333333;">.</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span>entry <span style="color: #333333;">-></span> entry<span style="color: #333333;">.</span><span style="color: #0000cc;">startsWith</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"INFO"</span><span style="color: #333333;">)).</span><span style="color: #0000cc;">ifPresent</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">printWarnOnlyNumber</span><span style="color: #333333;">(</span>Optional<span style="color: #333333;"><</span>String<span style="color: #333333;">></span> singleLog<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
singleLog<span style="color: #333333;">.</span><span style="color: #0000cc;">filter</span><span style="color: #333333;">(</span>entry <span style="color: #333333;">-></span> entry<span style="color: #333333;">.</span><span style="color: #0000cc;">startsWith</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"WARN"</span><span style="color: #333333;">))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">map</span><span style="color: #333333;">(</span>warn <span style="color: #333333;">-></span> warn<span style="color: #333333;">.</span><span style="color: #0000cc;">substring</span><span style="color: #333333;">(</span>warn<span style="color: #333333;">.</span><span style="color: #0000cc;">length</span><span style="color: #333333;">()</span> <span style="color: #333333;">-</span> <span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">ifPresent</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span></pre>
<br />
Output :<br />
<br />
<br />
<pre class="prettyprint"><span class="pln">INFO</span><span class="pun">::</span><span class="pln"> some info here </span><span class="lit">1</span><span class="pln">
INFO</span><span class="pun">::</span><span class="pln"> some info here </span><span class="lit">2</span><span class="pln">
ERROR</span><span class="pun">::</span><span class="pln"> some error here </span><span class="lit">3</span><span class="pln">
INFO</span><span class="pun">::</span><span class="pln"> some info here </span><span class="lit">4</span><span class="pln">
</span><span class="lit">5</span><span class="pln">
INFO</span><span class="pun">::</span><span class="pln"> some info here </span><span class="lit">7</span><span class="pln">
</span><span class="lit">8</span></pre>
<br />
<br />
<h2>
<b>No == null</b> <b>and no if</b>. </h2>
Optional takes care of it for you ;)<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-60968846255586287852015-06-12T14:55:00.000+01:002015-06-26T09:36:27.624+01:00Java 8, easier with Cyclops : Try <br />
<a href="https://github.com/aol/cyclops" target="_blank">Cyclops</a> is another promising open source library from <a href="https://github.com/johnmcclean-aol" target="_blank">John McClean</a> in AOL, that aims to extends and simplify Java 8 functionality.<br />
<br />
One of its feature is <a href="https://github.com/aol/cyclops/wiki/Try-:-functional-exception-handling-for-Java-8" target="_blank">Try</a> that <i>offers an alternative way to manage exception handling</i>.<br />
<br />
Imagine you have a method that load files from some location : <br />
<br />
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">private</span> List<span style="color: #333333;"><</span>File<span style="color: #333333;">></span> <span style="color: #0066bb; font-weight: bold;">loadFiles</span><span style="color: #333333;">()</span> <span style="color: #333333;">{</span> </pre>
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;"> return</span> Lists<span style="color: #333333;">.</span><span style="color: #0000cc;">newArrayList</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"somePath_one"</span><span style="color: #333333;">),</span> <span style="color: #008800; font-weight: bold;">new</span> File<span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"somePath_two"</span><span style="color: #333333;">));</span>
<span style="color: #333333;">}</span> </pre>
<br />
Many things could go wrong there, file does not exist, network is down, etc.<br />
<br />
Traditionally, we could have manage exceptions surrounding the loadFiles() method with try and catch and handle each exception within a catch statement.<br />
<br />
Cyclops Try made things easier and cleaner :<br />
<br />
<pre style="line-height: 125%; margin: 0;">Try<span style="color: #333333;">.</span><span style="color: #0000cc;">withCatch</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">this</span><span style="color: #333333;">::</span>loadFiles<span style="color: #333333;">,</span> Exception<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">)</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">onFail</span><span style="color: #333333;">(</span>FileNotFoundException<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">,</span> e <span style="color: #333333;">-></span> System<span style="color: #333333;">.</span><span style="color: #0000cc;">err</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Something specific to do here if file does not exists"</span> <span style="color: #333333;">+</span> e<span style="color: #333333;">))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">onFail</span><span style="color: #333333;">(</span>IOException<span style="color: #333333;">.</span><span style="color: #0000cc;">class</span><span style="color: #333333;">,</span> e <span style="color: #333333;">-></span> System<span style="color: #333333;">.</span><span style="color: #0000cc;">err</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Maybe retry a couple of times before dropping the operation"</span> <span style="color: #333333;">+</span> e<span style="color: #333333;">))</span>
<span style="color: #333333;">.</span><span style="color: #0000cc;">forEach</span><span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">::</span>println<span style="color: #333333;">);</span>
</pre>
<br />
Based on the exception, different functions can be triggered.<br />
<br />
<img alt="http://media.giphy.com/media/U0uowJVj7ewO4/giphy.gif" class="transparent" src="http://media.giphy.com/media/U0uowJVj7ewO4/giphy.gif" />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-3765127506450609222015-06-11T13:55:00.001+01:002015-06-11T13:55:35.401+01:0010 team building tips<h2>
1) Good Morning</h2>
<br />
<img alt="http://media.giphy.com/media/RbVOveSAHkk2A/giphy.gif" class="transparent" src="http://media.giphy.com/media/RbVOveSAHkk2A/giphy.gif" height="265" width="400" /><br />
<br />
When you enter in the office, before sitting on your desk, smile and say good morning to the team. Yes, E V E R Y day.<br />
<br />
<h2>
2) Listen when someone is talking to you.</h2>
<img alt="http://media.giphy.com/media/kwNSxdqqutsEE/giphy.gif" src="http://media.giphy.com/media/kwNSxdqqutsEE/giphy.gif" height="195" width="400" /><br />
<br />
When a team member is talking to you, look him in the eyes and show interest in what he is saying.<br />
<br />
<h2>
3) Give space, build trust</h2>
<br />
<img alt="http://media.giphy.com/media/HdsLiowsPuoso/giphy.gif" class="transparent" height="225" src="http://media.giphy.com/media/HdsLiowsPuoso/giphy.gif" width="400" /><br />
<br />
Let team member fail sometimes and repair from their failures.<br />
You may be always right, but who cares?! Other people need to learn to fail and take responsibilities.<br />
<br />
<br />
<h2>
4) Connect</h2>
<br />
<img alt="http://media.giphy.com/media/LPAohuvTif0ek/giphy.gif" class="transparent" height="339" src="http://media.giphy.com/media/LPAohuvTif0ek/giphy.gif" width="400" /> <br />
<br />
Go and take a coffee with each person in the team separately. <br />
<br />
<h2>
5) Congratulate</h2>
<br />
<img alt="http://media.giphy.com/media/IAFlOwj4XsNlm/giphy.gif" class="transparent" height="223" src="http://media.giphy.com/media/IAFlOwj4XsNlm/giphy.gif" width="400" /> <br />
<br />
When someone does something good, tell her/him!<br />
<br />
<h2>
6) Keep your personal problems out of work.</h2>
<br />
<img alt="http://media.giphy.com/media/dIDae8s93pave/giphy.gif" height="200" src="http://media.giphy.com/media/dIDae8s93pave/giphy.gif" width="400" /><br />
<br />
Don't shout at people because your last evening was bad. <br />
<br />
<h2>
7) Do pair programming</h2>
<br />
<img alt="http://media.giphy.com/media/ggKMDmjkGZ5ZK/giphy.gif" class="transparent" height="262" src="http://media.giphy.com/media/ggKMDmjkGZ5ZK/giphy.gif" width="400" /> <br />
<br />
Great way to share knowledge and build solid work relationships.<br />
<br />
<h2>
8) Feedback</h2>
<br />
<img alt="http://media.giphy.com/media/ql89wsWoAgTAI/giphy.gif" class="transparent" height="347" src="http://media.giphy.com/media/ql89wsWoAgTAI/giphy.gif" width="400" /><br />
<br />
Do code reviews without sounding the king of the programming universe. Explain in a calm and friendly tone whatever you want to say.<br />
<br />
<h2>
9) Have lunch together</h2>
<br />
<img alt="http://media.giphy.com/media/PvBnBEr7CUUDK/giphy.gif" class="transparent" height="300" src="http://media.giphy.com/media/PvBnBEr7CUUDK/giphy.gif" width="400" /><br />
<br />
If possible go regularly to lunch with as many team members as possible. <br />
<br />
<br />
<h2>
10) See you tomorrow</h2>
<br />
<img alt="http://media.giphy.com/media/77ggDHDT372j6/giphy.gif" class="transparent" src="http://media.giphy.com/media/77ggDHDT372j6/giphy.gif" height="335" width="400" /><br />
<br />
When you leave in the evening, if you are not the last person in the team left, say goodbye.<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-4718564667288149002015-06-04T12:53:00.000+01:002015-06-26T09:38:07.237+01:00Memoize functions in java 8 Memoization is not a grammar error, <i><b>memoization</b> is an optimization technique used primarily to speed up computer programs by storing the results of expensive function calls and returning the cached result when the same inputs occur again. </i><br />
<br />
<a href="http://en.wikipedia.org/wiki/Memoization"><span style="font-size: x-small;">http://en.wikipedia.org/wiki/Memoization</span></a><br />
<br />
I will explain it with a simple example.<br />
<br />
Context :<br />
<br />
Table PIZZA, columns ID, NAME <br />
<br />
We have a java function called "<b>hereThePizzaGiveMeTheId</b>" where you pass a String representing a pizza name and it will return the correspondent id retrieved from the DB.<br />
<br />
<pre style="line-height: 125%; margin: 0;">Function<span style="color: #333333;"><</span>String<span style="color: #333333;">,</span> Integer<span style="color: #333333;">></span> hereThePizzaGiveMeTheId <span style="color: #333333;">=</span> name <span style="color: #333333;">-></span> <span style="color: #333333;">{</span>
<span style="color: #333399; font-weight: bold;">int</span> pizzaId <span style="color: #333333;">=</span> <span style="color: #333333;">-</span><span style="color: #0000dd; font-weight: bold;">1</span><span style="color: #333333;">;</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Select ID from PIZZA where name = '"</span> <span style="color: #333333;">+</span> name <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">"'"</span><span style="color: #333333;">);</span>
pizzaId <span style="color: #333333;">=</span> pizzaDao<span style="color: #333333;">.</span><span style="color: #0000cc;">get</span><span style="color: #333333;">(</span>name<span style="color: #333333;">);</span>
<span style="color: #008800; font-weight: bold;">return</span> pizzaId<span style="color: #333333;">;</span>
<span style="color: #333333;">};</span></pre>
<br />
Now, if I call this function with the same pizza name I will hit the DB each time :<br />
<br />
System.out.println(hereThePizzaGiveMeTheId.apply("Margherita"));<br />
System.out.println(hereThePizzaGiveMeTheId.apply("Margherita"));<br />
System.out.println(hereThePizzaGiveMeTheId.apply("Margherita"));<br />
System.out.println(hereThePizzaGiveMeTheId.apply("Margherita"));<br />
System.out.println(hereThePizzaGiveMeTheId.apply("Four Season"));<br />
System.out.println(hereThePizzaGiveMeTheId.apply("Four Season"));<br />
System.out.println(hereThePizzaGiveMeTheId.apply("Four Season"));<br />
System.out.println(hereThePizzaGiveMeTheId.apply("Four Season"));<br />
System.out.println(hereThePizzaGiveMeTheId.apply("Gorgonzola and figs"));<br />
System.out.println(hereThePizzaGiveMeTheId.apply("Gorgonzola and figs"));<br />
System.out.println(hereThePizzaGiveMeTheId.apply("Gorgonzola and figs"));<br />
System.out.println(hereThePizzaGiveMeTheId.apply("Gorgonzola and figs"));<br />
<br />
<br />
OUTPUT:<br />
<br />
<br />
<b>Select ID from PIZZA where name = 'Margherita'<br />1<br />Select ID from PIZZA where name = 'Margherita'<br />1<br />Select ID from PIZZA where name = 'Margherita'<br />1<br />Select ID from PIZZA where name = 'Margherita'<br />1<br />Select ID from PIZZA where name = 'Four Season'<br />2<br />Select ID from PIZZA where name = 'Four Season'<br />2<br />Select ID from PIZZA where name = 'Four Season'<br />2<br />Select ID from PIZZA where name = 'Four Season'<br />2<br />Select ID from PIZZA where name = 'Gorgonzola and figs'<br />3<br />Select ID from PIZZA where name = 'Gorgonzola and figs'<br />3<br />Select ID from PIZZA where name = 'Gorgonzola and figs'<br />3<br />Select ID from PIZZA where name = 'Gorgonzola and figs'<br />3</b><br />
<br />
<br />
Fantastic, but I don't want to run that function every time, if I already know the result based on the pizza name.<br />
So, lets memoize (cache) the result of that function.<br />
<br />
First we create a generic method that wraps a function into another function that will behave the same as the input one, but will check if the result is already computed : <br />
<br />
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333333;"><</span>X<span style="color: #333333;">,</span> Y<span style="color: #333333;">></span> Function<span style="color: #333333;"><</span>X<span style="color: #333333;">,</span> Y<span style="color: #333333;">></span> memoise<span style="color: #333333;">(</span>Function<span style="color: #333333;"><</span>X<span style="color: #333333;">,</span> Y<span style="color: #333333;">></span> fn<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
Map<span style="color: #333333;"><</span>X<span style="color: #333333;">,</span> Y<span style="color: #333333;">></span> pp <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ConcurrentHashMap<span style="color: #333333;"><</span>X<span style="color: #333333;">,</span> Y<span style="color: #333333;">>();</span>
<span style="color: #008800; font-weight: bold;">return</span> <span style="color: #333333;">(</span>a<span style="color: #333333;">)</span> <span style="color: #333333;">-></span> pp<span style="color: #333333;">.</span><span style="color: #0000cc;">computeIfAbsent</span><span style="color: #333333;">(</span>a<span style="color: #333333;">,</span> fn<span style="color: #333333;">);</span>
<span style="color: #333333;">}</span>
</pre>
<br />
<br />
Then we wrap our "<b>hereThePizzaGiveMeTheId</b>" function :<br />
<br />
<pre style="line-height: 125%; margin: 0;">Function<span style="color: #333333;"><</span>String<span style="color: #333333;">,</span> Integer<span style="color: #333333;">></span> memoziedHereThePizzaGiveMeTheId <span style="color: #333333;">=</span> memoise<span style="color: #333333;">(</span>hereThePizzaGiveMeTheId<span style="color: #333333;">);</span></pre>
<pre style="line-height: 125%; margin: 0;"><span style="color: #333333;"> </span></pre>
Lastly, we call again the same logic as before, but using the new <b>memoziedHereThePizzaGiveMeTheId</b> function :<br />
<br />
<br />
<pre style="line-height: 125%; margin: 0;"> System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>memoziedHereThePizzaGiveMeTheId<span style="color: #333333;">.</span><span style="color: #0000cc;">apply</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Margherita"</span><span style="color: #333333;">));</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>memoziedHereThePizzaGiveMeTheId<span style="color: #333333;">.</span><span style="color: #0000cc;">apply</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Margherita"</span><span style="color: #333333;">));</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>memoziedHereThePizzaGiveMeTheId<span style="color: #333333;">.</span><span style="color: #0000cc;">apply</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Margherita"</span><span style="color: #333333;">));</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>memoziedHereThePizzaGiveMeTheId<span style="color: #333333;">.</span><span style="color: #0000cc;">apply</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Margherita"</span><span style="color: #333333;">));</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>memoziedHereThePizzaGiveMeTheId<span style="color: #333333;">.</span><span style="color: #0000cc;">apply</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Four Season"</span><span style="color: #333333;">));</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>memoziedHereThePizzaGiveMeTheId<span style="color: #333333;">.</span><span style="color: #0000cc;">apply</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Four Season"</span><span style="color: #333333;">));</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>memoziedHereThePizzaGiveMeTheId<span style="color: #333333;">.</span><span style="color: #0000cc;">apply</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Four Season"</span><span style="color: #333333;">));</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>memoziedHereThePizzaGiveMeTheId<span style="color: #333333;">.</span><span style="color: #0000cc;">apply</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Four Season"</span><span style="color: #333333;">));</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>memoziedHereThePizzaGiveMeTheId<span style="color: #333333;">.</span><span style="color: #0000cc;">apply</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Gorgonzola and figs"</span><span style="color: #333333;">));</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>memoziedHereThePizzaGiveMeTheId<span style="color: #333333;">.</span><span style="color: #0000cc;">apply</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Gorgonzola and figs"</span><span style="color: #333333;">));</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>memoziedHereThePizzaGiveMeTheId<span style="color: #333333;">.</span><span style="color: #0000cc;">apply</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Gorgonzola and figs"</span><span style="color: #333333;">));</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span>memoziedHereThePizzaGiveMeTheId<span style="color: #333333;">.</span><span style="color: #0000cc;">apply</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"Gorgonzola and figs"</span><span style="color: #333333;">));</span></pre>
<br />
<br />
<br />
OUTPUT:<br />
<br />
<b>Select ID from PIZZA where name = 'Margherita'<br />1<br />1<br />1<br />1<br />Select ID from PIZZA where name = 'Four Season'<br />2<br />2<br />2<br />2<br />Select ID from PIZZA where name = 'Gorgonzola and figs'<br />3<br />3<br />3<br />3</b><br />
<b></b><br />
<b></b><br />
<b></b><br />
<b></b><br />
<b></b><br />
<br />
We will hit the DB only if the result of the function is not already present in the map.<br />
<br />
That's it.<br />
<br />
p.s.<br />
<br />
Gorgonzola and figs is a fantastic pizza :<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-NAezQhKSx3s/VXA8AE18PDI/AAAAAAAAC2U/k7r3fgvZnmk/s1600/pizza-e-fichi.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="http://3.bp.blogspot.com/-NAezQhKSx3s/VXA8AE18PDI/AAAAAAAAC2U/k7r3fgvZnmk/s640/pizza-e-fichi.jpg" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-88804655188536162312015-05-14T16:09:00.002+01:002015-06-26T09:43:31.743+01:00Simple benchmarking : Immutable Collections VS Persistent CollectionsOften you need to add new elements to a collection.<br />
Because you are a good and careful developer you want to keep things immutable as much as possible. So adding a new element to an immutable collections will mean that you have to create a new immutable collection that contains all the elements of the original collections plus the new element.<br />
<br />
You can create immutable collections using the <a href="https://code.google.com/p/guava-libraries/wiki/ImmutableCollectionsExplained" target="_blank">guava</a> library and also using the recent <a href="http://pcollections.org/" target="_blank">pCollection</a> library.<br />
<br />
In the following example, we will build 2 immutable lists, one immutable from guava and one persistent from pCollection. <br />
<br />
They both will contain 10.000 integers initially.<br />
<br />
We will create 20.000 immutable lists one for each type and we will measure the time taken.<br />
<br />
<br />
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">package</span> com<span style="color: #333333;">.</span><span style="color: #0000cc;">marco</span><span style="color: #333333;">.</span><span style="color: #0000cc;">pcollections</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.ArrayList</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.HashMap</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.List</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">java.util.Map</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.pcollections.PCollection</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">org.pcollections.TreePVector</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">import</span> <span style="color: #0e84b5; font-weight: bold;">com.google.common.collect.ImmutableList</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">PcollectionVSImmutable</span> <span style="color: #333333;">{</span>
<span style="color: #008800; font-weight: bold;">public</span> <span style="color: #008800; font-weight: bold;">static</span> <span style="color: #333399; font-weight: bold;">void</span> <span style="color: #0066bb; font-weight: bold;">main</span><span style="color: #333333;">(</span>String<span style="color: #333333;">[]</span> args<span style="color: #333333;">)</span> <span style="color: #333333;">{</span>
List<span style="color: #333333;"><</span>Integer<span style="color: #333333;">></span> bigList <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> ArrayList<span style="color: #333333;"><</span>Integer<span style="color: #333333;">>();</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> i <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span><span style="color: #333333;">;</span> i <span style="color: #333333;"><</span> <span style="color: #0000dd; font-weight: bold;">10000</span><span style="color: #333333;">;</span> i<span style="color: #333333;">++)</span> <span style="color: #333333;">{</span>
bigList<span style="color: #333333;">.</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> Integer<span style="color: #333333;">(</span>i<span style="color: #333333;">));</span>
<span style="color: #333333;">}</span>
Map<span style="color: #333333;"><</span>Integer<span style="color: #333333;">,</span> ImmutableList<span style="color: #333333;"><</span>Object<span style="color: #333333;">>></span> allImmutable <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> HashMap<span style="color: #333333;"><</span>Integer<span style="color: #333333;">,</span> ImmutableList<span style="color: #333333;"><</span>Object<span style="color: #333333;">>>();</span>
Map<span style="color: #333333;"><</span>Integer<span style="color: #333333;">,</span> PCollection<span style="color: #333333;"><</span>Integer<span style="color: #333333;">>></span> allPersistent <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> HashMap<span style="color: #333333;"><</span>Integer<span style="color: #333333;">,</span> PCollection<span style="color: #333333;"><</span>Integer<span style="color: #333333;">>>();</span>
PCollection<span style="color: #333333;"><</span>Integer<span style="color: #333333;">></span> persistent <span style="color: #333333;">=</span> TreePVector<span style="color: #333333;">.</span><span style="color: #0000cc;">from</span><span style="color: #333333;">(</span>bigList<span style="color: #333333;">);</span>
<span style="color: #333399; font-weight: bold;">long</span> start <span style="color: #333333;">=</span> System<span style="color: #333333;">.</span><span style="color: #0000cc;">currentTimeMillis</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> i <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">10000</span><span style="color: #333333;">;</span> i <span style="color: #333333;"><</span> <span style="color: #0000dd; font-weight: bold;">30000</span><span style="color: #333333;">;</span> i<span style="color: #333333;">++)</span> <span style="color: #333333;">{</span>
allPersistent<span style="color: #333333;">.</span><span style="color: #0000cc;">put</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> Integer<span style="color: #333333;">(</span>i<span style="color: #333333;">),</span> persistent<span style="color: #333333;">.</span><span style="color: #0000cc;">plus</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> Integer<span style="color: #333333;">(</span>i<span style="color: #333333;">)));</span>
<span style="color: #333333;">}</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"creating 20.000 pCollections takes : "</span> <span style="color: #333333;">+</span> <span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">currentTimeMillis</span><span style="color: #333333;">()</span> <span style="color: #333333;">-</span> start<span style="color: #333333;">)</span> <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">"ms"</span><span style="color: #333333;">);</span>
ImmutableList<span style="color: #333333;"><</span>Integer<span style="color: #333333;">></span> immutable <span style="color: #333333;">=</span> ImmutableList<span style="color: #333333;">.</span><span style="color: #0000cc;">copyOf</span><span style="color: #333333;">(</span>bigList<span style="color: #333333;">);</span>
start <span style="color: #333333;">=</span> System<span style="color: #333333;">.</span><span style="color: #0000cc;">currentTimeMillis</span><span style="color: #333333;">();</span>
<span style="color: #008800; font-weight: bold;">for</span> <span style="color: #333333;">(</span><span style="color: #333399; font-weight: bold;">int</span> i <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">10000</span><span style="color: #333333;">;</span> i <span style="color: #333333;"><</span> <span style="color: #0000dd; font-weight: bold;">30000</span><span style="color: #333333;">;</span> i<span style="color: #333333;">++)</span> <span style="color: #333333;">{</span>
allImmutable<span style="color: #333333;">.</span><span style="color: #0000cc;">put</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> Integer<span style="color: #333333;">(</span>i<span style="color: #333333;">),</span> ImmutableList<span style="color: #333333;">.</span><span style="color: #0000cc;">builder</span><span style="color: #333333;">().</span><span style="color: #0000cc;">addAll</span><span style="color: #333333;">(</span>immutable<span style="color: #333333;">).</span><span style="color: #0000cc;">add</span><span style="color: #333333;">(</span><span style="color: #008800; font-weight: bold;">new</span> Integer<span style="color: #333333;">(</span>i<span style="color: #333333;">)).</span><span style="color: #0000cc;">build</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"creating 20.000 Guava ImmutableList takes : "</span> <span style="color: #333333;">+</span> <span style="color: #333333;">(</span>System<span style="color: #333333;">.</span><span style="color: #0000cc;">currentTimeMillis</span><span style="color: #333333;">()</span> <span style="color: #333333;">-</span> start<span style="color: #333333;">)</span> <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">"ms"</span><span style="color: #333333;">);</span>
System<span style="color: #333333;">.</span><span style="color: #0000cc;">out</span><span style="color: #333333;">.</span><span style="color: #0000cc;">println</span><span style="color: #333333;">(</span><span style="background-color: #fff0f0;">"All immutable size : "</span> <span style="color: #333333;">+</span> allImmutable<span style="color: #333333;">.</span><span style="color: #0000cc;">size</span><span style="color: #333333;">()</span> <span style="color: #333333;">+</span> <span style="background-color: #fff0f0;">" allPersistent size : "</span> <span style="color: #333333;">+</span> allPersistent<span style="color: #333333;">.</span><span style="color: #0000cc;">size</span><span style="color: #333333;">());</span>
<span style="color: #333333;">}</span>
<span style="color: #333333;">}</span></pre>
<br />
<br />
Output :<br />
<br />
<i>creating 20.000 pCollections takes : 29ms<br />creating 20.000 Guava ImmutableList takes : 18347ms<br />All immutable size : 20000 allPersistent size : 20000</i>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-85205264221406788242015-05-11T11:42:00.000+01:002015-05-11T11:45:35.316+01:00Immutable Objects with Lombok - workshop<div dir="ltr" id="docs-internal-guid-bbd92c4e-4284-bd53-bcd3-fceec9d66dd6" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-size: large;"><span style="color: blue;"><span style="background-color: transparent; font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">An </span><span style="background-color: transparent; font-family: Arial; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">immutable object</span><span style="background-color: transparent; font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> is an object whose state cannot be modified after it is created.</span></span></span></div>
<br />
<br />
<h3>
Why Immutable Objects are important?</h3>
<br />
Because you have no total control : objects can be passed anywhere and can arrive from anywhere in the code. If they are mutable, then any object can modify their state. Different threads can access the same model object and modify/read its state creating many problems difficult to handle.<br />
<br />
<h3>
What is an Immutable object?</h3>
<br />
<div dir="ltr" id="docs-internal-guid-78337fac-427b-12ff-019b-fd725b399948" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: blue;"><span style="background-color: transparent; font-family: Muli; font-size: 32px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">Final private fields, No Setters & Unmodifiable collections</span></span></div>
<br />
<h3>
An example ?</h3>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://lh6.googleusercontent.com/AzTBzeUmoZrwUCdslEgcoeSQKxP0fbN8rmKPFweNZPuqWe-5TXGWVekmUECVe6vszkmCn4ttuC0ocel0fAmTj4cITm5wxO65W15Vgygt58ZmefTQMUcAaSLY3805mFuci8kxTM3TJQ" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="440px;" id="docs-internal-guid-7832bf9e-427b-dd1a-35db-1269aced6d79" src="https://lh6.googleusercontent.com/AzTBzeUmoZrwUCdslEgcoeSQKxP0fbN8rmKPFweNZPuqWe-5TXGWVekmUECVe6vszkmCn4ttuC0ocel0fAmTj4cITm5wxO65W15Vgygt58ZmefTQMUcAaSLY3805mFuci8kxTM3TJQ" width="588px;" /></a></div>
<br />
<h3>
What does Lombok?</h3>
<br />
Project Lombok aims to reduce boilerplate codes by replacing them with a simple set of
annotations.<br />
<br />
<h3>
How to install Lombok?</h3>
<br />
see here : <a href="https://projectlombok.org/download.html" target="_blank">https://projectlombok.org/download.html</a><br />
<br />
<br />
<div style="text-align: center;">
<u><b><span style="font-size: x-large;">Workshop : </span></b></u></div>
<br />
<div dir="ltr" id="docs-internal-guid-78338007-4285-c542-b83b-51f1a381eebb" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-size: large;"><span style="background-color: transparent; color: white; font-family: Muli; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"><span style="color: black;">Create a model object called Home with the following fields : </span></span></span></div>
<div dir="ltr" id="docs-internal-guid-78338007-4285-c542-b83b-51f1a381eebb" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-78338007-4286-4954-116b-590729a3ab4a" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-size: x-small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">String address;</span></span></div>
<span style="font-size: x-small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">The street name of your home</span></span><br />
<div dir="ltr" id="docs-internal-guid-78338007-4285-c542-b83b-51f1a381eebb" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-78338007-4286-c60d-1bb9-b701d0cccf4e" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-size: x-small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">int age;</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-size: x-small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">How old were you when you enter this house </span></span></div>
<span style="font-size: x-small;"><br /></span>
<br />
<div dir="ltr" id="docs-internal-guid-78338007-4287-1e92-b090-871fd97b1dac" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-size: x-small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">int fromYear;</span></span></div>
<span style="font-size: x-small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">Which year you start living there</span></span><br />
<div dir="ltr" id="docs-internal-guid-78338007-4287-582a-10b4-eee09b38ba55" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-size: x-small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">int toYear; </span></span></div>
<span style="font-size: x-small;"><b><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Which year you left</span></b></span><br />
<br />
<br />
<div dir="ltr" id="docs-internal-guid-78338007-4287-eab9-4aa1-d71764c71ba3" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-size: small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">Create a toString() method to print the details.</span></span></div>
<br />
<br />
<br />
<br />
<div dir="ltr" id="docs-internal-guid-7831d6bd-4288-4722-95e6-dce7b7cbc7b8" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: white; font-family: Muli; font-size: 24px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"><span style="color: black;">Create a class called MyHomes that prints the list of Homes you lived in. </span></span></div>
<div dir="ltr" id="docs-internal-guid-7831d6bd-4288-4722-95e6-dce7b7cbc7b8" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-7831d6bd-4288-9bce-fc77-f47484249f20" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: white; font-family: Muli; font-size: 19px; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;"><span style="color: black;"><span style="font-size: small;">This class should create as many homes you lived in and print the details for each one of them. </span></span></span><span style="background-color: transparent; color: white; font-family: Muli; font-size: 19px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"><br /></span></div>
<div dir="ltr" id="docs-internal-guid-7831d6bd-4288-4722-95e6-dce7b7cbc7b8" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-7831d6bd-4288-4722-95e6-dce7b7cbc7b8" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: blue;"><span style="background-color: transparent; font-family: Muli; font-size: 24px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">Now make the class immutable</span></span></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: blue;"><span style="background-color: transparent; font-family: Muli; font-size: 24px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"><span id="docs-internal-guid-78338028-4289-7f11-fba0-67fcd28f486c" style="background-color: transparent; font-family: Muli; font-size: 24px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">Now try to clean the Home class code with Lombok!!</span></span></span></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-78338028-4289-e518-2c3e-62d46d99724f" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-size: small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">Hints / Immutability support :-</span></span></div>
<span style="font-size: small;"><br /></span>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-size: small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">val</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-size: small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">@AllArgsConstructor</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-size: small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">@Builder</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-size: small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">@Value</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-size: small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">@FieldDefaults</span></span></div>
<br />
<br />
<br />
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-size: small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;"><span id="docs-internal-guid-78338028-4289-7f11-fba0-67fcd28f486c" style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;"> </span> </span></span></div>
<div dir="ltr" id="docs-internal-guid-7831d6bd-4288-4722-95e6-dce7b7cbc7b8" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-size: small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;"> </span></span><span id="docs-internal-guid-4e332f78-428a-78a8-82a0-894e681455fc" style="background-color: transparent; font-family: Muli; font-size: 48px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">How can we change a value? </span></div>
<div dir="ltr" id="docs-internal-guid-7831d6bd-4288-4722-95e6-dce7b7cbc7b8" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-7832bfbe-428a-d640-34b3-445a59555ab4" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; font-family: Muli; font-size: 24px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">Add an immutable boolean field to indicate if the address has been verified.</span></div>
<br />
<span style="font-size: small;"><span style="background-color: transparent; font-family: Muli; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">Default should be false.</span></span><br />
<div dir="ltr" id="docs-internal-guid-7831d6bd-4288-4722-95e6-dce7b7cbc7b8" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-7832bfbe-428b-4cf9-f349-d18f40289819" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; font-family: Muli; font-size: 24px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">Add a method to MyHomes to verify a List of Homes</span></div>
<div dir="ltr" id="docs-internal-guid-7832bfbe-428b-4cf9-f349-d18f40289819" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-7832bfbe-428b-4cf9-f349-d18f40289819" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: blue;"> <span style="background-color: transparent; font-family: Muli; font-size: 24px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"><span id="docs-internal-guid-78338028-4289-7f11-fba0-67fcd28f486c" style="background-color: transparent; font-family: Muli; font-size: 24px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;">Now try to use the @Wither annotation from Lombok!!</span></span></span></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br />
<br />
<br />
<div style="text-align: center;">
<u><b><span style="font-size: x-large;">End of the workshop</span></b></u></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br /></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-7832bff9-428d-1d3e-0c48-1a2900d3684d" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; font-family: "Droid Serif"; font-size: 24px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Stretch content</span></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-rxV98vnnYiM/VVCGooSZzSI/AAAAAAAACz8/KyifDqibZsE/s1600/Screen%2BShot%2B2015-05-11%2Bat%2B11.37.56.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="310" src="http://1.bp.blogspot.com/-rxV98vnnYiM/VVCGooSZzSI/AAAAAAAACz8/KyifDqibZsE/s640/Screen%2BShot%2B2015-05-11%2Bat%2B11.37.56.png" width="640" /></a></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-xPytrZ63JZE/VVCGzks712I/AAAAAAAAC0E/WIRbHgDx72I/s1600/Screen%2BShot%2B2015-05-11%2Bat%2B11.38.55.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="426" src="http://1.bp.blogspot.com/-xPytrZ63JZE/VVCGzks712I/AAAAAAAAC0E/WIRbHgDx72I/s640/Screen%2BShot%2B2015-05-11%2Bat%2B11.38.55.png" width="640" /></a></div>
<br />
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Vi2q9WaT4fQ/VVCG5yLSdBI/AAAAAAAAC0M/NGhbeehv-XE/s1600/Screen%2BShot%2B2015-05-11%2Bat%2B11.39.20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="340" src="http://2.bp.blogspot.com/-Vi2q9WaT4fQ/VVCG5yLSdBI/AAAAAAAAC0M/NGhbeehv-XE/s640/Screen%2BShot%2B2015-05-11%2Bat%2B11.39.20.png" width="640" /></a></div>
<br />
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-vjna2F2QroI/VVCHD9YMrKI/AAAAAAAAC0U/eWoRvJ-oPsE/s1600/Screen%2BShot%2B2015-05-11%2Bat%2B11.40.02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-vjna2F2QroI/VVCHD9YMrKI/AAAAAAAAC0U/eWoRvJ-oPsE/s640/Screen%2BShot%2B2015-05-11%2Bat%2B11.40.02.png" width="640" /></a></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" id="docs-internal-guid-4e332f74-4289-334b-9333-775c4203a009" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<b><a href="http://2.bp.blogspot.com/-cwRJqB2n8ZM/VVCHO24UXYI/AAAAAAAAC0c/dgYianbeaes/s1600/Screen%2BShot%2B2015-05-11%2Bat%2B11.40.46.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="306" src="http://2.bp.blogspot.com/-cwRJqB2n8ZM/VVCHO24UXYI/AAAAAAAAC0c/dgYianbeaes/s640/Screen%2BShot%2B2015-05-11%2Bat%2B11.40.46.png" width="640" /></a></b></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-47467776295447478422015-05-02T10:55:00.002+01:002015-05-04T15:44:01.879+01:00In the JVM 1 + 1 = 4Assuming a and b are equals to 1 :<br />
<br />
int a = 1;<br />
int b = 1; <br />
<br />
How many JVM operations you see in the following code?<br />
<br />
int c = a + b;<br />
<br />
<br />
<br />
<br />
<br />
<br />
The answer is 4 :<br />
<br />
<div data-canvas-width="98.93333333333332" style="font-family: monospace; font-size: 23.5556px; left: 81.62px; top: 400.515px; transform: scaleX(1.00952);">
<span style="font-family: Verdana,sans-serif;"><b><span style="font-size: small;">iload_0</span></b></span></div>
<div data-canvas-width="98.93333333333332" style="font-family: monospace; font-size: 23.5556px; left: 81.62px; top: 425.955px; transform: scaleX(1.00952);">
<span style="font-family: Verdana,sans-serif;"><b><span style="font-size: small;">iload_1</span></b></span></div>
<div data-canvas-width="56.533333333333324" style="font-family: monospace; font-size: 23.5556px; left: 81.62px; top: 451.395px; transform: scaleX(1.00952);">
<span style="font-family: Verdana,sans-serif;"><b><span style="font-size: small;">iadd</span></b></span></div>
<span style="font-family: Verdana,sans-serif;"><b><span style="font-size: small;">istore_2</span></b></span><br />
<br />
<br />
The JVM will load a and b (index 0 and 1 of the local variable array), add them together (in the operand stack), and will assign the result to c (index 2 of the local variable array).<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-61862552864542416672015-02-04T10:37:00.001+00:002015-02-04T10:43:08.638+00:00Gmail like outlookWe migrated from Outlook to Gmail here at work recently. I love the flat design of Gmail, but I also love the Outlook preview panel on the right when you click on the emails.<br />
So, after a bit of research (and the help of a colleague, thanks Gordon!), I found what I was looking for :<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-DoxX9gM5rng/VNH0bB21NCI/AAAAAAAACwI/bHOxfT4-QDo/s1600/Screen%2BShot%2B2015-02-04%2Bat%2B10.28.33.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-DoxX9gM5rng/VNH0bB21NCI/AAAAAAAACwI/bHOxfT4-QDo/s1600/Screen%2BShot%2B2015-02-04%2Bat%2B10.28.33.png" height="145" width="320" /></a></div>
<br />
<br />
Steps :<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-2GuV4L993po/VNH0yBcZFqI/AAAAAAAACwQ/HTaicJqmfok/s1600/Screen%2BShot%2B2015-02-04%2Bat%2B10.30.29.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<ol>
<li>On the left panel of your Gmail, where you have the list of your labels, click on the <b>more</b> link.</li>
<li> Now click on <b>Manage Labels</b> link.</li>
<li>Here click on the <span style="color: blue;"><b>Labs</b></span> tab.</li>
<li>In the "Search for a lab:" enter <i>preview pane .</i></li>
<li>Click on Enable option.</li>
<li>Gmail will reload.</li>
<li>On the top right of the screen there will be a new a drop down menu : </li>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-5vxC-_hRgvY/VNH2EtneQTI/AAAAAAAACwc/fyNzM3phRcw/s1600/Screen%2BShot%2B2015-02-04%2Bat%2B10.35.49.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-5vxC-_hRgvY/VNH2EtneQTI/AAAAAAAACwc/fyNzM3phRcw/s1600/Screen%2BShot%2B2015-02-04%2Bat%2B10.35.49.png" height="109" width="200" /></a></div>
<li>Choose Vertical Split.</li>
<li>Thank me later.</li>
</ol>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-86142023235237845202015-02-02T10:58:00.000+00:002015-02-02T11:43:56.660+00:00SimpleReact : Simple Functional Reactive Programming for Java 8We (the very productive and small team I work with here in Aol) have just released a very lightweight <a href="https://github.com/aol/simple-react">functional reactive programming library for Java 8</a>.
It builds entirely on pre-existing JDK 8 libraries (so functional
interfaces, Streams, CompletableFuture) and makes it very easy to create
asynchronous reactive dataflows.
<br />
<div style="height: 500px; overflow: hidden; width: 400px;">
<img height="800" src="https://cloud.githubusercontent.com/assets/9964792/5873625/4eae7c94-a2f0-11e4-94dd-7af88085a163.png" width="400" />
</div>
<h3>
Getting started</h3>
Getting started is as simple as setting up a basic Reactive flow such as the following and evolving from there -
<code>
</code><br />
<pre class="prettyprint"><code> List<String> strings = new SimpleReact()
.<Integer> react(() -> 1, () -> 2, () -> 3)
.then(it -> it * 100)
.then(it -> "*" + it)
.block();
</code></pre>
<code>
</code>
This will result in a list, that looks something like this :
<br />
<pre class="prettyprint"> ["*100","*200","*300"]
</pre>
Although not necessarily in that order. All the work will be done
asynchronously, and the block() method blocks the current thread until
all the work is complete (& blocking the current thread is
optional).
See more examples on the <a href="https://github.com/aol/simple-react/wiki/Getting-started-with-a-simple-example">SimpleReact wiki </a>.
<br />
<br />
<h3>
Adding SimpleReact as a dependency</h3>
<br />
SimpleReact is available on Maven Central.
<br />
<h4>
Gradle</h4>
<code>
</code><br />
<pre class="prettyprint"><code>compile group: 'com.aol.simplereact', name:'simple-react', version:'0.1'
</code></pre>
<code>
</code>
<br />
<h4>
Gradle</h4>
<code>
</code><br />
<pre class="prettyprint"><code><dependency>
<groupId>com.aol.simplereact</groupId>
<artifactId>simple-react</artifactId>
<version>0.1</version>
<scope>compile</scope>
</dependency></code></pre>
<code>
<pre class="prettyprint"> </pre>
</code>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-41046220972568612722014-10-03T14:32:00.004+01:002014-10-03T15:05:22.602+01:00Java 8 it's easy : Higher-order Function<div class="p1">
<b><span style="color: red; font-size: large;">higher-order what?</span></b></div>
<div class="p2">
<br /></div>
<div class="p3">
Higher-order means that it is possible to <b>pass</b> to a method both values and <b>functions</b> and in the same way the method itself can <b>return</b> either a value or a <b>function</b>.</div>
<div class="p2">
<br /></div>
<div class="p3">
Example:</div>
<div class="p3">
• public void doSomething(String name, Function someFunction){...}</div>
<div class="p2">
<br /></div>
<br />
<div class="p3">
• public Function createAnAction(Integer someInteger)</div>
<div class="p3">
<br /></div>
<div class="p1">
<b><span style="color: #38761d; font-size: x-large;">EASY!!!!</span></b></div>
<div class="p2">
<br /></div>
<div class="p2">
<br /></div>
<div class="p3">
<u><span style="font-size: large;">Use case 1:</span></u></div>
<div class="p2">
<br /></div>
<div class="p4">
<i>Print a message with weight information in kilos. </i></div>
<div class="p5">
<br /></div>
<div class="p3">
</div>
<div class="p4">
This is easy : </div>
<div class="p4">
<br /></div>
<div class="p1">
<span class="s1">package</span> com<span class="s2">.</span>marco<span class="s2">.</span>higherOrder<span class="s2">;</span></div>
<div class="p2">
public<span class="s3"> </span>class<span class="s3"> </span><span class="s4">Printer</span><span class="s3"> </span><span class="s2">{</span></div>
<div class="p3">
<br /></div>
<div class="p1">
<span class="s1">public</span> <span class="s1">void</span> <span class="s1">print</span><span class="s2">(</span><span class="s1">int</span> weight<span class="s2">)</span> <span class="s2">{</span></div>
<div class="p4">
<span class="s3"> </span><span class="s4">System</span><span class="s2">.</span><span class="s1">out</span><span class="s2">.</span><span class="s3">println</span><span class="s2">(</span>"Printing : your weight is "<span class="s3"> </span><span class="s2">+</span><span class="s3"> weight </span><span class="s2">+</span><span class="s3"> </span>" kilos"<span class="s2">);</span></div>
<div class="p1">
<span class="s2">}</span></div>
<div class="p3">
<br /></div>
<div class="p1">
<span class="s1">public</span> <span class="s1">static</span> <span class="s1">void</span> main<span class="s2">(</span><span class="s4">String</span><span class="s2">[]</span> args<span class="s2">)</span> <span class="s2">{</span></div>
<div class="p1">
<span class="s4">Printer</span> printer <span class="s2">=</span> <span class="s1">new</span> <span class="s4">Printer</span><span class="s2">();</span></div>
<div class="p1">
printer<span class="s2">.</span><span class="s1">print</span><span class="s2">(</span><span class="s5">65</span><span class="s2">);</span></div>
<div class="p3">
<br /></div>
<div class="p1">
<span class="s2">}</span></div>
<div class="p4">
</div>
<div class="p5">
}</div>
<div class="p5">
<br /></div>
<div class="p1">
<u><span style="font-size: large;">Use case 2:</span></u></div>
<div class="p2">
<br /></div>
<div class="p3">
<i>I need to be able to print different weight unit like stone and pounds.</i></div>
<div class="p4">
<br /></div>
<div class="p4">
<br /></div>
<div class="p4">
<br /></div>
<div class="p4">
<br /></div>
<div class="p5">
<b><span style="color: #741b47; font-size: x-large;">Ok, just put an if and shut up!!</span></b></div>
<div class="p5">
<b><span style="color: #741b47; font-size: x-large;"><br /></span></b></div>
<div class="p6">
Putting an <i>if</i> it means to add and pass a boolean and then check that boolean and put a boring if/else.</div>
<div class="p4">
<br /></div>
<div class="p3">
Also what about open close principle? what if we need to add yet another weight unit?</div>
<div class="p3">
<br /></div>
<div class="p3">
<br /></div>
<div class="p4">
<br /></div>
<div class="p7">
<b><span style="color: #38761d; font-size: large;">Higher-order Function to the rescue:</span></b></div>
<div class="p4">
<br /></div>
<div class="p3">
I want a class in charge of handling different weight units :</div>
<div class="p4">
<br /></div>
<table cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td valign="middle">
<div class="p8">
<br /></div>
</td>
<td class="td1" valign="top">
<div class="p9">
<span class="s1">package</span> com<span class="s2">.</span>marco<span class="s2">.</span>higherOrder<span class="s2">;</span></div>
<div class="p10">
public<span class="s3"> </span>class<span class="s3"> </span><span class="s4">Scale</span><span class="s3"> </span><span class="s2">{</span></div>
<div class="p11">
<br /></div>
<div class="p9">
<span class="s1">public</span> <span class="s4">String</span> toStones<span class="s2">(</span><span class="s1">int</span> weight<span class="s2">)</span> <span class="s2">{</span></div>
<div class="p9">
<span class="s1">return</span> <span class="s5">"your weight is "</span> <span class="s2">+</span> weight <span class="s2">+</span> <span class="s5">" stones"</span><span class="s2">;</span></div>
<div class="p9">
<span class="s2">}</span></div>
<div class="p11">
<br /></div>
<div class="p9">
<span class="s1">public</span> <span class="s4">String</span> toKilos<span class="s2">(</span><span class="s1">int</span> weight<span class="s2">)</span> <span class="s2">{</span></div>
<div class="p9">
<span class="s1">return</span> <span class="s5">"the weight is "</span> <span class="s2">+</span> weight <span class="s2">+</span> <span class="s5">" kilos"</span><span class="s2">;</span></div>
<div class="p9">
<span class="s2">}</span></div>
<div class="p11">
<br /></div>
<div class="p9">
<span class="s1">public</span> <span class="s4">String</span> toPounds<span class="s2">(</span><span class="s1">int</span> weight<span class="s2">)</span> <span class="s2">{</span></div>
<div class="p9">
<span class="s1">return</span> <span class="s5">"the weight is "</span> <span class="s2">+</span> weight <span class="s2">+</span> <span class="s5">" pounds"</span><span class="s2">;</span></div>
<div class="p9">
<span class="s2">}</span></div>
<div class="p12">
}</div>
<div class="p12">
<br /></div>
</td>
</tr>
</tbody>
</table>
<div class="p3">
Then I can add a Function in my Printer.print method and pass functions:</div>
<div class="p4">
<br /></div>
<table cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td valign="middle">
<div class="p8">
<br /></div>
</td>
<td class="td1" valign="top">
<div class="p9">
<span class="s1">package</span> com<span class="s2">.</span>marco<span class="s2">.</span>higherOrder<span class="s2">;</span></div>
<div class="p10">
import<span class="s3"> java</span><span class="s2">.</span><span class="s3">util</span><span class="s2">.</span>function<span class="s2">.</span><span class="s4">Function</span><span class="s2">;</span></div>
<div class="p10">
public<span class="s3"> </span>class<span class="s3"> </span><span class="s4">Printer</span><span class="s3"> </span><span class="s2">{</span></div>
<div class="p11">
<br /></div>
<div class="p9">
<span class="s1">public</span> <span class="s1">void</span> <span class="s1">print</span><span class="s2">(</span><span class="s1">int</span> weight<span class="s2">,</span> <span class="s4">Function</span><span class="s2"><</span><span class="s4">Integer</span><span class="s2">,</span> <span class="s4">String</span><span class="s2">></span> scale<span class="s2">)</span> <span class="s2">{</span></div>
<div class="p9">
<span class="s4">System</span><span class="s2">.</span><span class="s1">out</span><span class="s2">.</span>println<span class="s2">(</span><span class="s5">"Printing : "</span> <span class="s2">+</span> scale<span class="s2">.</span>apply<span class="s2">(</span>weight<span class="s2">));</span></div>
<div class="p9">
<span class="s2">}</span></div>
<div class="p11">
<br /></div>
<div class="p9">
<span class="s1">public</span> <span class="s1">static</span> <span class="s1">void</span> main<span class="s2">(</span><span class="s4">String</span><span class="s2">[]</span> args<span class="s2">)</span> <span class="s2">{</span></div>
<div class="p9">
<span class="s4">Printer</span> sender <span class="s2">=</span> <span class="s1">new</span> <span class="s4">Printer</span><span class="s2">();</span></div>
<div class="p9">
<span class="s4">Scale</span> scale <span class="s2">=</span> <span class="s1">new</span> <span class="s4">Scale</span><span class="s2">();</span></div>
<div class="p11">
<br /></div>
<div class="p9">
sender<span class="s2">.</span><span class="s1">print</span><span class="s2">(</span><span class="s6">65</span><span class="s2">,</span> scale<span class="s2">::</span>toKilos<span class="s2">);</span></div>
<div class="p11">
<br /></div>
<div class="p9">
sender<span class="s2">.</span><span class="s1">print</span><span class="s2">(</span><span class="s6">65</span><span class="s2">,</span> scale<span class="s2">::</span>toStones<span class="s2">);</span></div>
<div class="p11">
<br /></div>
<div class="p9">
sender<span class="s2">.</span><span class="s1">print</span><span class="s2">(</span><span class="s6">65</span><span class="s2">,</span> scale<span class="s2">::</span>toPounds<span class="s2">);</span></div>
<div class="p11">
<br /></div>
<div class="p9">
<span class="s2">}</span></div>
<div class="p12">
}</div>
</td>
</tr>
</tbody>
</table>
<div class="p2">
<br /></div>
<div class="p3">
<span class="s7">Function</span><span class="s8"><</span><span class="s7">Integer</span><span class="s8">,</span><span class="s9"> </span><span class="s7">String</span><span class="s8">></span> means that this function will accept an Integer and will return a String.</div>
<div class="p4">
<br /></div>
<div class="p3">
<span class="s9">scale</span><span class="s8">::</span><span class="s9">toKilos </span>means that the method toKilos of the scale instance will be called.</div>
<div class="p13">
<b><span style="color: #38761d; font-size: x-large;">EASY!!!!</span></b></div>
<div class="p2">
<br /></div>
<div class="p14">
<b><span style="color: #741b47; font-size: large;">What if I don't need the Scale class?</span></b></div>
<div class="p2">
<br /></div>
<div class="p6">
Then don't don't it :)!!!</div>
<div class="p2">
<br /></div>
<table cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td valign="middle">
<div class="p8">
<br /></div>
</td>
<td class="td1" valign="top">
<div class="p9">
<span class="s1">package</span> com<span class="s2">.</span>marco<span class="s2">.</span>higherOrder<span class="s2">;</span></div>
<div class="p10">
import<span class="s3"> java</span><span class="s2">.</span><span class="s3">util</span><span class="s2">.</span>function<span class="s2">.</span><span class="s4">Function</span><span class="s2">;</span></div>
<div class="p10">
public<span class="s3"> </span>class<span class="s3"> </span><span class="s4">Printer</span><span class="s3"> </span><span class="s2">{</span></div>
<div class="p11">
<br /></div>
<div class="p9">
<span class="s1">public</span> <span class="s1">void</span> <span class="s1">print</span><span class="s2">(</span><span class="s1">int</span> weight<span class="s2">,</span> <span class="s4">Function</span><span class="s2"><</span><span class="s4">Integer</span><span class="s2">,</span> <span class="s4">String</span><span class="s2">></span> scale<span class="s2">)</span> <span class="s2">{</span></div>
<div class="p9">
<span class="s4">System</span><span class="s2">.</span><span class="s1">out</span><span class="s2">.</span>println<span class="s2">(</span><span class="s5">"Printing : "</span> <span class="s2">+</span> scale<span class="s2">.</span>apply<span class="s2">(</span>weight<span class="s2">));</span></div>
<div class="p9">
<span class="s2">}</span></div>
<div class="p11">
<br /></div>
<div class="p9">
<span class="s1">public</span> <span class="s1">static</span> <span class="s1">void</span> main<span class="s2">(</span><span class="s4">String</span><span class="s2">[]</span> args<span class="s2">)</span> <span class="s2">{</span></div>
<div class="p9">
<span class="s4">Printer</span> sender <span class="s2">=</span> <span class="s1">new</span> <span class="s4">Printer</span><span class="s2">();</span></div>
<div class="p11">
<br /></div>
<div class="p9">
sender<span class="s2">.</span><span class="s1">print</span><span class="s2">(</span><span class="s6">65</span><span class="s2">,</span> p <span class="s2">-></span> <span class="s5">"your weight is "</span> <span class="s2">+</span> p <span class="s2">+</span> <span class="s5">" kilos"</span><span class="s2">);</span></div>
<div class="p11">
<br /></div>
<div class="p9">
sender<span class="s2">.</span><span class="s1">print</span><span class="s2">(</span><span class="s6">65</span><span class="s2">,</span> p <span class="s2">-></span> <span class="s5">"your weight is "</span> <span class="s2">+</span> p <span class="s2">+</span> <span class="s5">" stones"</span><span class="s2">);</span></div>
<div class="p11">
<br /></div>
<div class="p9">
sender<span class="s2">.</span><span class="s1">print</span><span class="s2">(</span><span class="s6">65</span><span class="s2">,</span> p <span class="s2">-></span> <span class="s5">"your weight is "</span> <span class="s2">+</span> p <span class="s2">+</span> <span class="s5">" pounds"</span><span class="s2">);</span></div>
<div class="p11">
<br /></div>
<div class="p9">
<span class="s2">}</span></div>
<div class="p12">
}</div>
</td>
</tr>
</tbody>
</table>
<div class="p3">
<span class="s9">p </span><span class="s8">-></span><span class="s9"> </span><span class="s10">"your weight is "</span><span class="s9"> </span><span class="s8">+</span><span class="s9"> p </span><span class="s8">+</span><span class="s9"> </span><span class="s10">" kilos"</span> the p is simply the int that will be passed to the method.</div>
<div class="p15">
<br /></div>
<div class="p15">
<br /></div>
<div class="p15">
<br /></div>
<div class="p2">
<br /></div>
<div class="p16">
<br /></div>
<div class="p17">
<span style="color: #38761d; font-size: x-large;"><b>Functional it’s </b><span class="s11"><b>easy</b></span><b> , don’t trust who says it’s hard!</b></span></div>
<div class="p18">
<b></b><br /></div>
<div class="p18">
<b></b><br /></div>
<div class="p19">
<b>Have a great weekend</b></div>
<div class="p16">
<br /></div>
<div class="p16">
<br /></div>
<div class="p19">
<b>Ciao.</b></div>
<div class="p5">
</div>
<div class="p16">
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-39002084375191382222014-09-29T13:57:00.002+01:002014-09-29T13:57:37.571+01:00Java 8 : Null? no thanks!You know, I know, they know, everybody knows, returning null from a public method is often a bad practice.<br />
Reasons are multiple, from the risk of raising NullPointerException in runtime to the horrible == null check in your code. <br />
<br />
To avoid returning nulls in Java 8 you can use java.util.Optional (if you are on previous version of Java, Guava has similar functionality).<br />
<br />
<pre class="prettyprint"><span class="kwd">package</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">marco</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">ArrayList</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">HashMap</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">List</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">Map</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">Optional</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">NoNullsThanks</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">final</span><span class="pln"> </span><span class="typ">Map</span><span class="pun"><</span><span class="typ">String</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Integer</span><span class="pun">></span><span class="pln"> nameAge </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">HashMap</span><span class="pun"><</span><span class="typ">String</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Integer</span><span class="pun">>();</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Integer</span><span class="pln"> getAge</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="typ">Optional</span><span class="pun">.</span><span class="pln">ofNullable</span><span class="pun">(</span><span class="pln">nameAge</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">name</span><span class="pun">)).</span><span class="pln">orElse</span><span class="pun">(-</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">final</span><span class="pln"> </span><span class="typ">Map</span><span class="pun"><</span><span class="typ">String</span><span class="pun">,</span><span class="pln"> </span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">>></span><span class="pln"> nameEmails </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">HashMap</span><span class="pun"><</span><span class="typ">String</span><span class="pun">,</span><span class="pln"> </span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">>>();</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> getEmails</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="typ">Optional</span><span class="pun">.</span><span class="pln">ofNullable</span><span class="pun">(</span><span class="pln">nameEmails</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">name</span><span class="pun">)).</span><span class="pln">orElse</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun"><</span><span class="typ">String</span><span class="pun">>());</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln"></span></pre>
<pre class="prettyprint"><span class="pln">
</span></pre>
<pre class="prettyprint">
</pre>
Nice & Clean :)<br />
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-38167896604087752582014-09-19T12:12:00.000+01:002014-09-19T16:15:59.571+01:00Tridimensional developersWorking in the industry for a while, I noticed different behaviors between developers.<br />
<br />
These differences are mostly related to their personalities, their team spirit and finally their entrepreneurship skills.<br />
<br />
I identified 3 types or better 3 dimensions in which I can fit all the people I work and worked with. <br />
Before starting and describing these dimensions, I just want to point out couple of important things.<br />
<ol>
<li>This has nothing to do with how good you are with the code or design or testing. You can be the best kickass-bruce-lee-coder, but still entering in the mono-dimensional category.</li>
<li>This has also nothing to do with your level of seniority, I saw Juniors that can perfectly fit in the tridimensional category and team leaders falling in the mono-dimensional one. </li>
<li>This is perfectly applicable to ANY workplace and ANY type of job and ANY industry.</li>
<li>It is just my point of view in a boring Friday afternoon.</li>
</ol>
So lets start :)<br />
<br />
<h3>
Mono-Dimensional Developer</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-xpIpx3yP6zo/VBwAxP_4ifI/AAAAAAAACq0/M_Elmf1SsCE/s1600/KfZFDUO.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-xpIpx3yP6zo/VBwAxP_4ifI/AAAAAAAACq0/M_Elmf1SsCE/s1600/KfZFDUO.jpg" height="320" width="240" /></a></div>
You work daily at your stories/tasks <br />
<br />
You participate to meetings about process and technologies<br />
<br />
You communicate with other team members about status<br />
updates, risks and issues encountered<br />
<br />
<span class="perm_content">You create and/or maintain software applications </span><br />
<br />
<span class="perm_content"><span class="perm_content">You keep updated yourself about emerging technologies and
trends</span></span><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<h3 style="text-align: right;">
Bidimensional Developer </h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-CubwfRO0Eqo/VBwIW8j5BXI/AAAAAAAACrE/VjuIq6kpR6c/s1600/C64%2BIndy.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="http://4.bp.blogspot.com/-CubwfRO0Eqo/VBwIW8j5BXI/AAAAAAAACrE/VjuIq6kpR6c/s1600/C64%2BIndy.jpg" height="200" width="320" /></a></div>
<div style="text-align: left;">
<span style="font-weight: normal;">You cover the Mono-dimensional points</span></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="font-weight: normal;">You help team members without being asked directly</span></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="font-weight: normal;">You share with your team what you learned using slides/blogs/etc.</span></div>
<div style="text-align: left;">
<span style="font-weight: normal;"><br /></span></div>
<div style="text-align: left;">
<span style="font-weight: normal;">You actively participate to process and technology meetings, asking questions and/or proposing solutions.</span></div>
<div style="text-align: left;">
<span style="font-weight: normal;"><br /></span>
<span style="font-weight: normal;"><br /></span>
<span style="font-weight: normal;"><br /></span></div>
<div style="text-align: left;">
<span style="font-weight: normal;"><br /></span></div>
<div style="text-align: left;">
<span style="font-weight: normal;"><br /></span></div>
<h3 style="text-align: left;">
Tridimensional Developer </h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ILTDrfX8FOQ/VBwMDElngFI/AAAAAAAACrQ/4M7kLxnzziY/s1600/3D-glasses-anaglyph.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-ILTDrfX8FOQ/VBwMDElngFI/AAAAAAAACrQ/4M7kLxnzziY/s1600/3D-glasses-anaglyph.jpg" height="300" width="400" /></a></div>
<div style="text-align: left;">
You cover the Bidimensional points</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
You create, propose and promote new processes and technologies</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
You take team building actions when needed without being asked directly</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
You actively participate to meetings other than process and technology</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
You create blogs/wikis/etc in order to facilitate communication without being asked directly</div>
<div style="text-align: left;">
</div>
<div style="text-align: left;">
</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
You see opportunities everywhere and you act on them.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br />
<br /></div>
<div style="text-align: left;">
</div>
<h2 style="text-align: center;">
<span style="font-size: x-large;">
So which developer are you?</span></h2>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="font-weight: normal;"><br /></span></div>
<div style="text-align: left;">
<span style="font-weight: normal;"><br /></span></div>
<h3 style="text-align: left;">
</h3>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-42935610897083238332014-09-12T17:19:00.000+01:002014-09-15T08:25:45.428+01:00Friday-Benchmarking Functional Java Lets image your product owner goes crazy one day and he asks you to do the following :<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">From a set of Strings as follows : </span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">"marco_8", "john_33", "marco_1", "john_33", "thomas_5", "john_33", "marco_4", ....</span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">give me back a comma separated String with only the marco's numbers and numbers need to be in order. </span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;"> Example of expected result :</span><br />
<span style="font-family: "Courier New",Courier,monospace;"><br /></span>
<span style="font-family: "Courier New",Courier,monospace;">"1,4,8"</span><br />
<br />
<br />
I will implement this logic in 4 distinct ways and I will micro benchmark each one of them. The ways I'm going to implement the logic are :<br />
<br />
<ul>
<li>Traditional java with loops and all.</li>
<li>Functional with Guava </li>
<li>Functional with java 8 stream</li>
<li>Functional with java 8 parallelStream</li>
</ul>
<br />
<h3>
Code is below or in <a href="https://gist.github.com/marcocast/e414ec530e4e360bed70" target="_blank">gist</a></h3>
<br />
<pre class="prettyprint"><span class="kwd">package</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">marco</span><span class="pun">.</span><span class="pln">brownbag</span><span class="pun">.</span><span class="pln">functional</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">ArrayList</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">HashSet</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">Iterator</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">List</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">Set</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="pln">stream</span><span class="pun">.</span><span class="typ">Collectors</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">google</span><span class="pun">.</span><span class="pln">common</span><span class="pun">.</span><span class="kwd">base</span><span class="pun">.</span><span class="typ">Function</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">google</span><span class="pun">.</span><span class="pln">common</span><span class="pun">.</span><span class="kwd">base</span><span class="pun">.</span><span class="typ">Joiner</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">google</span><span class="pun">.</span><span class="pln">common</span><span class="pun">.</span><span class="kwd">base</span><span class="pun">.</span><span class="typ">Predicates</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">google</span><span class="pun">.</span><span class="pln">common</span><span class="pun">.</span><span class="pln">collect</span><span class="pun">.</span><span class="typ">Collections2</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">google</span><span class="pun">.</span><span class="pln">common</span><span class="pun">.</span><span class="pln">collect</span><span class="pun">.</span><span class="typ">Ordering</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MicroBenchMarkFunctional</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">final</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> totStrings </span><span class="pun">=</span><span class="pln"> 200000</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">Set</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> someNames </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">HashSet</span><span class="pun"><</span><span class="typ">String</span><span class="pun">>();</span><span class="pln">
init</span><span class="pun">(</span><span class="pln">someNames</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> totStrings</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
someNames</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"marco_"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> i</span><span class="pun">);</span><span class="pln">
someNames</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"someone_else_"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> i</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"start"</span><span class="pun">);</span><span class="pln">
run</span><span class="pun">(</span><span class="pln">someNames</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> run</span><span class="pun">(</span><span class="typ">Set</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> someNames</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"========================"</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">long</span><span class="pln"> start </span><span class="pun">=</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="pln">nanoTime</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> totalLoops </span><span class="pun">=</span><span class="pln"> </span><span class="lit">20</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> totalLoops</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
classic</span><span class="pun">(</span><span class="pln">someNames</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Classic : "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">((</span><span class="typ">System</span><span class="pun">.</span><span class="pln">nanoTime</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> start</span><span class="pun">))</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> totalLoops</span><span class="pun">);</span><span class="pln">
start </span><span class="pun">=</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="pln">nanoTime</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> totalLoops</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
guava</span><span class="pun">(</span><span class="pln">someNames</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Guava : "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">((</span><span class="typ">System</span><span class="pun">.</span><span class="pln">nanoTime</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> start</span><span class="pun">))</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> totalLoops</span><span class="pun">);</span><span class="pln">
start </span><span class="pun">=</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="pln">nanoTime</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> totalLoops</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
stream</span><span class="pun">(</span><span class="pln">someNames</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Stream : "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">((</span><span class="typ">System</span><span class="pun">.</span><span class="pln">nanoTime</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> start</span><span class="pun">))</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> totalLoops</span><span class="pun">);</span><span class="pln">
start </span><span class="pun">=</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="pln">nanoTime</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> totalLoops</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
parallelStream</span><span class="pun">(</span><span class="pln">someNames</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Parallel Stream : "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">((</span><span class="typ">System</span><span class="pun">.</span><span class="pln">nanoTime</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> start</span><span class="pun">))</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> totalLoops</span><span class="pun">);</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"========================"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> init</span><span class="pun">(</span><span class="typ">Set</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> someNames</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
someNames</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"marco_1"</span><span class="pun">);</span><span class="pln">
classic</span><span class="pun">(</span><span class="pln">someNames</span><span class="pun">);</span><span class="pln">
guava</span><span class="pun">(</span><span class="pln">someNames</span><span class="pun">);</span><span class="pln">
stream</span><span class="pun">(</span><span class="pln">someNames</span><span class="pun">);</span><span class="pln">
parallelStream</span><span class="pun">(</span><span class="pln">someNames</span><span class="pun">);</span><span class="pln">
someNames</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> stream</span><span class="pun">(</span><span class="typ">Set</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> someNames</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> someNames</span><span class="pun">.</span><span class="pln">stream</span><span class="pun">().</span><span class="pln">filter</span><span class="pun">(</span><span class="pln">element </span><span class="pun">-></span><span class="pln"> element</span><span class="pun">.</span><span class="pln">startsWith</span><span class="pun">(</span><span class="str">"m"</span><span class="pun">)).</span><span class="pln">map</span><span class="pun">(</span><span class="pln">element </span><span class="pun">-></span><span class="pln"> element</span><span class="pun">.</span><span class="pln">replaceAll</span><span class="pun">(</span><span class="str">"marco_"</span><span class="pun">,</span><span class="pln"> </span><span class="str">""</span><span class="pun">)).</span><span class="pln">sorted</span><span class="pun">()</span><span class="pln">
</span><span class="pun">.</span><span class="pln">collect</span><span class="pun">(</span><span class="typ">Collectors</span><span class="pun">.</span><span class="pln">joining</span><span class="pun">(</span><span class="str">","</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> parallelStream</span><span class="pun">(</span><span class="typ">Set</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> someNames</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> someNames</span><span class="pun">.</span><span class="pln">parallelStream</span><span class="pun">().</span><span class="pln">filter</span><span class="pun">(</span><span class="pln">element </span><span class="pun">-></span><span class="pln"> element</span><span class="pun">.</span><span class="pln">startsWith</span><span class="pun">(</span><span class="str">"m"</span><span class="pun">)).</span><span class="pln">map</span><span class="pun">(</span><span class="pln">element </span><span class="pun">-></span><span class="pln"> element</span><span class="pun">.</span><span class="pln">replaceAll</span><span class="pun">(</span><span class="str">"marco_"</span><span class="pun">,</span><span class="pln"> </span><span class="str">""</span><span class="pun">)).</span><span class="pln">sorted</span><span class="pun">()</span><span class="pln">
</span><span class="pun">.</span><span class="pln">collect</span><span class="pun">(</span><span class="typ">Collectors</span><span class="pun">.</span><span class="pln">joining</span><span class="pun">(</span><span class="str">","</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> guava</span><span class="pun">(</span><span class="typ">Set</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> someNames</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="typ">Joiner</span><span class="pun">.</span><span class="pln">on</span><span class="pun">(</span><span class="str">','</span><span class="pun">).</span><span class="pln">join</span><span class="pun">(</span><span class="pln">
</span><span class="typ">Ordering</span><span class="pun">.</span><span class="kwd">from</span><span class="pun">(</span><span class="typ">String</span><span class="pun">.</span><span class="pln">CASE_INSENSITIVE_ORDER</span><span class="pun">).</span><span class="pln">immutableSortedCopy</span><span class="pun">(</span><span class="pln">
</span><span class="typ">Collections2</span><span class="pun">.</span><span class="pln">transform</span><span class="pun">(</span><span class="typ">Collections2</span><span class="pun">.</span><span class="pln">filter</span><span class="pun">(</span><span class="pln">someNames</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Predicates</span><span class="pun">.</span><span class="pln">containsPattern</span><span class="pun">(</span><span class="str">"marco"</span><span class="pun">)),</span><span class="pln"> REPLACE_MARCO</span><span class="pun">)));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">Function</span><span class="pun"><</span><span class="typ">String</span><span class="pun">,</span><span class="pln"> </span><span class="typ">String</span><span class="pun">></span><span class="pln"> REPLACE_MARCO </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Function</span><span class="pun"><</span><span class="typ">String</span><span class="pun">,</span><span class="pln"> </span><span class="typ">String</span><span class="pun">>()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="lit">@Override</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> apply</span><span class="pun">(</span><span class="kwd">final</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> element</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> element</span><span class="pun">.</span><span class="pln">replaceAll</span><span class="pun">(</span><span class="str">"marco_"</span><span class="pun">,</span><span class="pln"> </span><span class="str">""</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> classic</span><span class="pun">(</span><span class="typ">Set</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> someNames</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> namesWithM </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun"><</span><span class="typ">String</span><span class="pun">>();</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">String</span><span class="pln"> element </span><span class="pun">:</span><span class="pln"> someNames</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">element</span><span class="pun">.</span><span class="pln">startsWith</span><span class="pun">(</span><span class="str">"m"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
namesWithM</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">element</span><span class="pun">.</span><span class="pln">replaceAll</span><span class="pun">(</span><span class="str">"marco_"</span><span class="pun">,</span><span class="pln"> </span><span class="str">""</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="typ">Collections</span><span class="pun">.</span><span class="pln">sort</span><span class="pun">(</span><span class="pln">namesWithM</span><span class="pun">);</span><span class="pln">
</span><span class="typ">StringBuilder</span><span class="pln"> commaSeparetedString </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StringBuilder</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Iterator</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> namesWithMIterator </span><span class="pun">=</span><span class="pln"> namesWithM</span><span class="pun">.</span><span class="pln">iterator</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">namesWithMIterator</span><span class="pun">.</span><span class="pln">hasNext</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
commaSeparetedString</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">namesWithMIterator</span><span class="pun">.</span><span class="kwd">next</span><span class="pun">());</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">namesWithMIterator</span><span class="pun">.</span><span class="pln">hasNext</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
commaSeparetedString</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="str">","</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> commaSeparetedString</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span></pre>
<br />
<br />
<h4>
Two points before we dig into performance : </h4>
<ol>
<li>Forget about the init() method, that one is just to initialize objects in the jvm otherwise numbers are just crazy.</li>
<li>The java 8 functional style looks nicer and cleaner than guava and than developing in a traditional way :).</li>
</ol>
<br />
<h3>
Performance:</h3>
<br />
<br />
Running that program on my mac with 4 cores, the result is the following :<br />
<br />
<br />
========================<br />
Classic : 151941400<br />
Guava : 238798150<br />
Stream : 151853850<br />
Parallel Stream : 55724700<br />
========================<br />
<br />
Parallel Stream is <b>3 times faster</b>. This is because java will split the job in multiple tasks (total of tasks depends on your machine, cores, etc) and will run them in parallel, aggregating the result at the end. <br />
Classic Java and java 8 stream have more or less the same performance.<br />
Guava is the looser.<br />
<br />
<br />
That is amazing, so someone could think:<br />
<i>"cool, I can just always use parallelStream and I will have big bonus at the end of the year". </i><br />
But life is never easy. Here is what happens when you reduce that Set of strings from 200.000 to 20<br />
<br />
========================<br />
Classic : 36950<br />
Guava : 69650<br />
Stream : 29850<br />
Parallel Stream : 143350<br />
========================<br />
<br />
Parallel Stream became damn slow. This because parallelStream has a big overhead in terms of initializing and managing multitasking and assembling back the results.<br />
Java 8 stream looks now the winner compare to the other 2.<br />
<br />
Ok, at this point, someone could say something like :<br />
<i>"for collections with lots of elements I use parallelStream, otherwise I use stream"</i><br />
That would be nice and simple to get, but what happens when I reduce that Set again from 20 to 2?<br />
This :<br />
<br />
========================<br />
Classic : 8500<br />
Guava : 20050<br />
Stream : 24700<br />
Parallel Stream : 67850<br />
========================<br />
<br />
Classic java loops are faster with very few elements. <br />
<br />
So at this point I can go back to my crazy product owner and ask how many Strings he thinks to have in that input collection. 20? less? more? much more?<br />
<br />
<br />
Like the Carpenter says :<br />
<br />
<h1 class="a-size-large a-spacing-none" id="title">
<span class="a-size-large" id="productTitle">Measure Twice, Cut Once!!</span></h1>
<h1 class="a-size-large a-spacing-none" id="title">
<span class="a-size-large" id="productTitle"> </span></h1>
<h1 class="a-size-large a-spacing-none" id="title">
<span class="a-size-large" id="productTitle"> </span></h1>
<br />
<br />
<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-62343395273663914612014-09-08T15:50:00.001+01:002014-09-08T15:54:40.405+01:00Migrate your project from SVN to Git Stash in few stepsStep by step guide on how to migrate your SVN repository with all its history to the <a href="https://www.atlassian.com/software/stash" target="_blank">Stash</a>, the <a href="https://www.atlassian.com/" target="_blank">Atlassian</a> git manager.<br />
<br />
<br />
<h3>
Only once :</h3>
<ol>
<li> <a href="https://confluence.atlassian.com/display/STASH022/Adding+an+SSH+key+to+your+Stash+profile+on+Linux+and+Mac" target="_blank">add the ssh key</a></li>
<li>open a terminal
</li>
<li> create the authors.txt file in ~/Documents/ </li>
<li> git config svn.authorsfile ~/Documents/authors.txt </li>
</ol>
<br />
<h4>
authors.txt format :</h4>
<i>username = Name LastName <email> </i><br />
<br />
<h4>
example :</h4>
<i>gordof = Gordon Flash <gordon.flash@superhero.com></i><br />
<i>
marcoc = Marco Castigliego <marco.castigliego@superhero.com> </i><br />
<br />
<br />
<br />
<h3>
For each project : </h3>
For this example I will migrate a project called super-hero-service. <br />
<br />
<ol>
<li> Tell your team members to not commit on the project during the process.</li>
<li>Open a terminal</li>
<li>cd ~</li>
<li>mkdir migration</li>
<li>cd migration</li>
<li>git svn clone
svn+ssh://marcoc@svn.superhero.com/com/super/hero/Services/
--trunk=super-hero-service super-hero-service </li>
<li> <a class="external text" href="http://funstuffcafe.com/img/cool-amazing/coffee/coffee14.jpg" target="_blank">go to take a coffee</a>
</li>
<li> cd super-hero-service
</li>
<li> git svn show-ignore (Which outputs everything in the SVN
ignore property to the console. Then you can copy this to a new file
called .gitignore at the root of your repository.Add and commit the file.)</li>
<li>go to <a class="external free" href="https://stash.ops.aol.com/projects/LANA">https://stash.superhero.com/projectsServices</a> and create a repository called super-hero-service
</li>
<li> git remote add origin ssh://git@stash.suoperhero.com:2022/services/super-hero-service.git
</li>
<li> git push -u origin master
</li>
</ol>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-21123028347811818582014-08-22T14:24:00.000+01:002014-08-22T14:28:00.959+01:00Java 8 : Functional VS TraditionalThe business logic is the same :<br />
<br />
Given a String expression composed of visits / time like : "1/24h,1..3/3h,5/*"<br />
Then the result should be the following list of Strings <br />
"1/24h",<br />
"1/3h","2/3h","3/3h",<br />
"5/1h","5/2h","5/3h","5/4h","5/5h",until ,"24/1h"<br />
<br />
<br />
So, 2 things need to be solved, the dots and the stars for the visits and for the time.<br />
<br />
I will use Java 8 , but I'll show you the difference between implementing this logic using Functional and implementing it in a traditional way with loops and ifs.<br />
<br />
<pre class="prettyprint"><span class="kwd"><span class="kwd">package</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">marco</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">ArrayList</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">List</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="kwd">function</span><span class="pun">.</span><span class="typ">Function</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="pln">stream</span><span class="pun">.</span><span class="typ">Collectors</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">google</span><span class="pun">.</span><span class="pln">common</span><span class="pun">.</span><span class="pln">collect</span><span class="pun">.</span><span class="typ">ImmutableList</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">google</span><span class="pun">.</span><span class="pln">common</span><span class="pun">.</span><span class="pln">collect</span><span class="pun">.</span><span class="typ">Lists</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ExpressionConverter</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">final</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> COMMA </span><span class="pun">=</span><span class="pln"> </span><span class="str">","</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">final</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> SEPARATOR </span><span class="pun">=</span><span class="pln"> </span><span class="str">"/"</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">final</span><span class="pln"> </span><span class="typ">ImmutableList</span><span class="pun"><</span><span class="typ">Function</span><span class="pun"><</span><span class="typ">String</span><span class="pun">,</span><span class="pln"> </span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">>>></span><span class="pln"> visitFunctions</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">final</span><span class="pln"> </span><span class="typ">ImmutableList</span><span class="pun"><</span><span class="typ">Function</span><span class="pun"><</span><span class="typ">String</span><span class="pun">,</span><span class="pln"> </span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">>>></span><span class="pln"> timeFunctions</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">ExpressionConverter</span><span class="pun">(</span><span class="typ">DotsVisitFunction</span><span class="pln"> dotsVisitFunction</span><span class="pun">,</span><span class="pln"> </span><span class="typ">StarVisitFunction</span><span class="pln"> starVisitFunction</span><span class="pun">,</span><span class="pln"> </span><span class="typ">StandardFunction</span><span class="pln"> standardFunction</span><span class="pun">,</span><span class="pln">
</span><span class="typ">StarTimeFunction</span><span class="pln"> starTimeFunction</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">visitFunctions </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ImmutableList</span><span class="pun">.</span><span class="pln">of</span><span class="pun">(</span><span class="pln">dotsVisitFunction</span><span class="pun">,</span><span class="pln"> starVisitFunction</span><span class="pun">,</span><span class="pln"> standardFunction</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">timeFunctions </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ImmutableList</span><span class="pun">.</span><span class="pln">of</span><span class="pun">(</span><span class="pln">starTimeFunction</span><span class="pun">,</span><span class="pln"> standardFunction</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> convertVisitTimeExpressionFunctional</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> visitTimeExpression</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="typ">Lists</span><span class="pun">.</span><span class="pln">newArrayList</span><span class="pun">(</span><span class="pln">visitTimeExpression</span><span class="pun">.</span><span class="pln">split</span><span class="pun">(</span><span class="pln">COMMA</span><span class="pun">)).</span><span class="pln">parallelStream</span><span class="pun">().</span><span class="pln">filter</span><span class="pun">(</span><span class="pln">it </span><span class="pun">-></span><span class="pln"> </span><span class="pun">!</span><span class="pln">it</span><span class="pun">.</span><span class="pln">isEmpty</span><span class="pun">())</span><span class="pln">
</span><span class="pun">.</span><span class="pln">map</span><span class="pun">(</span><span class="pln">it </span><span class="pun">-></span><span class="pln"> interpretSingleExpressionFunctional</span><span class="pun">(</span><span class="pln">it</span><span class="pun">)).</span><span class="pln">flatMap</span><span class="pun">(</span><span class="pln">it </span><span class="pun">-></span><span class="pln"> it</span><span class="pun">.</span><span class="pln">parallelStream</span><span class="pun">()).</span><span class="pln">collect</span><span class="pun">(</span><span class="typ">Collectors</span><span class="pun">.</span><span class="pln">toList</span><span class="pun">());</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> convertVisitTimeExpressionTraditional</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> visitTimeExpression</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun"><</span><span class="typ">String</span><span class="pun">>();</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">String</span><span class="pln"> singleVisitTime </span><span class="pun">:</span><span class="pln"> visitTimeExpression</span><span class="pun">.</span><span class="pln">split</span><span class="pun">(</span><span class="pln">COMMA</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">singleVisitTime</span><span class="pun">.</span><span class="pln">isEmpty</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
result</span><span class="pun">.</span><span class="pln">addAll</span><span class="pun">(</span><span class="pln">interpretSingleVisitTimeExpressionTraditional</span><span class="pun">(</span><span class="pln">singleVisitTime</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> result</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> interpretSingleExpressionFunctional</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> singleExpression</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> visit </span><span class="pun">=</span><span class="pln"> singleExpression</span><span class="pun">.</span><span class="pln">split</span><span class="pun">(</span><span class="pln">SEPARATOR</span><span class="pun">)[</span><span class="lit">0</span><span class="pun">];</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> time </span><span class="pun">=</span><span class="pln"> singleExpression</span><span class="pun">.</span><span class="pln">split</span><span class="pun">(</span><span class="pln">SEPARATOR</span><span class="pun">)[</span><span class="lit">1</span><span class="pun">];</span><span class="pln">
</span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Lists</span><span class="pun">.</span><span class="pln">newArrayList</span><span class="pun">();</span><span class="pln">
visitFunctions</span><span class="pun">.</span><span class="pln">stream</span><span class="pun">().</span><span class="pln">map</span><span class="pun">(</span><span class="pln">it </span><span class="pun">-></span><span class="pln"> it</span><span class="pun">.</span><span class="pln">apply</span><span class="pun">(</span><span class="pln">visit</span><span class="pun">)).</span><span class="pln">flatMap</span><span class="pun">(</span><span class="pln">it </span><span class="pun">-></span><span class="pln"> it</span><span class="pun">.</span><span class="pln">stream</span><span class="pun">()).</span><span class="pln">forEach</span><span class="pun">(</span><span class="pln">visitIt </span><span class="pun">-></span><span class="pln"> </span><span class="pun">{</span><span class="pln">
timeFunctions</span><span class="pun">.</span><span class="pln">stream</span><span class="pun">().</span><span class="pln">map</span><span class="pun">(</span><span class="pln">it </span><span class="pun">-></span><span class="pln"> it</span><span class="pun">.</span><span class="pln">apply</span><span class="pun">(</span><span class="pln">time</span><span class="pun">)).</span><span class="pln">flatMap</span><span class="pun">(</span><span class="pln">it </span><span class="pun">-></span><span class="pln"> it</span><span class="pun">.</span><span class="pln">stream</span><span class="pun">()).</span><span class="pln">forEach</span><span class="pun">(</span><span class="pln">timeIt </span><span class="pun">-></span><span class="pln"> </span><span class="pun">{</span><span class="pln">
result</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">visitIt </span><span class="pun">+</span><span class="pln"> SEPARATOR </span><span class="pun">+</span><span class="pln"> timeIt</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> result</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> interpretSingleVisitTimeExpressionTraditional</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> singleExpression</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> visit </span><span class="pun">=</span><span class="pln"> singleExpression</span><span class="pun">.</span><span class="pln">split</span><span class="pun">(</span><span class="pln">SEPARATOR</span><span class="pun">)[</span><span class="lit">0</span><span class="pun">];</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> time </span><span class="pun">=</span><span class="pln"> singleExpression</span><span class="pun">.</span><span class="pln">split</span><span class="pun">(</span><span class="pln">SEPARATOR</span><span class="pun">)[</span><span class="lit">1</span><span class="pun">];</span><span class="pln">
</span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Lists</span><span class="pun">.</span><span class="pln">newArrayList</span><span class="pun">();</span><span class="pln">
</span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> visists </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Lists</span><span class="pun">.</span><span class="pln">newArrayList</span><span class="pun">();</span><span class="pln">
</span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> times </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Lists</span><span class="pun">.</span><span class="pln">newArrayList</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Function</span><span class="pun"><</span><span class="typ">String</span><span class="pun">,</span><span class="pln"> </span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">>></span><span class="pln"> visitFunction </span><span class="pun">:</span><span class="pln"> visitFunctions</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
visists</span><span class="pun">.</span><span class="pln">addAll</span><span class="pun">(</span><span class="pln">visitFunction</span><span class="pun">.</span><span class="pln">apply</span><span class="pun">(</span><span class="pln">visit</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Function</span><span class="pun"><</span><span class="typ">String</span><span class="pun">,</span><span class="pln"> </span><span class="typ">List</span><span class="pun"><</span><span class="typ">String</span><span class="pun">>></span><span class="pln"> timeFunction </span><span class="pun">:</span><span class="pln"> timeFunctions</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
times</span><span class="pun">.</span><span class="pln">addAll</span><span class="pun">(</span><span class="pln">timeFunction</span><span class="pun">.</span><span class="pln">apply</span><span class="pun">(</span><span class="pln">time</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">String</span><span class="pln"> visitIt </span><span class="pun">:</span><span class="pln"> visists</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">String</span><span class="pln"> timeIt </span><span class="pun">:</span><span class="pln"> times</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
result</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">visitIt </span><span class="pun">+</span><span class="pln"> SEPARATOR </span><span class="pun">+</span><span class="pln"> timeIt</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> result</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></span></pre>
<br />
<br />
As you can see we have 2 public and 2 private methods, functional and traditional. <br />
<br />
Here is a simple test focusing on the performance of the two styles :<br />
<br />
<pre class="prettyprint"><span class="kwd">package</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">marco</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">mockito</span><span class="pun">.</span><span class="typ">Matchers</span><span class="pun">.</span><span class="pln">any</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">mockito</span><span class="pun">.</span><span class="typ">Matchers</span><span class="pun">.</span><span class="pln">anyInt</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">mockito</span><span class="pun">.</span><span class="typ">Matchers</span><span class="pun">.</span><span class="pln">anyLong</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">mockito</span><span class="pun">.</span><span class="typ">Mockito</span><span class="pun">.</span><span class="pln">mock</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">mockito</span><span class="pun">.</span><span class="typ">Mockito</span><span class="pun">.</span><span class="kwd">when</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">math</span><span class="pun">.</span><span class="typ">BigDecimal</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">Set</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">junit</span><span class="pun">.</span><span class="typ">Before</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">junit</span><span class="pun">.</span><span class="typ">Test</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">google</span><span class="pun">.</span><span class="pln">common</span><span class="pun">.</span><span class="pln">collect</span><span class="pun">.</span><span class="typ">ImmutableSet</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">google</span><span class="pun">.</span><span class="pln">common</span><span class="pun">.</span><span class="pln">collect</span><span class="pun">.</span><span class="typ">Sets</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ExpressionConverterTest</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">final</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> EXPRESSIONS </span><span class="pun">=</span><span class="pln"> </span><span class="str">"6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,6/7400,9/65h,55..57/14400"</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Cache</span><span class="pln"> cache</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ExpressionConverter</span><span class="pln"> expressionConverter</span><span class="pun">;</span><span class="pln">
</span><span class="lit">@Before</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> init</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
cache </span><span class="pun">=</span><span class="pln"> mock</span><span class="pun">(</span><span class="typ">Cache</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
expressionConverter </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ExpressionConverter</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DotsVisitFunction</span><span class="pun">(</span><span class="pln">cache</span><span class="pun">),</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StarVisitFunction</span><span class="pun">(</span><span class="pln">cache</span><span class="pun">),</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StandardFunction</span><span class="pun">(),</span><span class="pln">
</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StarTimeFunction</span><span class="pun">(</span><span class="pln">cache</span><span class="pun">));</span><span class="pln">
</span><span class="typ">Set</span><span class="pun"><</span><span class="typ">Integer</span><span class="pun">></span><span class="pln"> totVisists </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Sets</span><span class="pun">.</span><span class="pln">newHashSet</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><=</span><span class="pln"> </span><span class="lit">100</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
totVisists</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">i</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">when</span><span class="pun">(</span><span class="pln">cache</span><span class="pun">.</span><span class="pln">getVisits</span><span class="pun">(</span><span class="pln">anyLong</span><span class="pun">(),</span><span class="pln"> </span><span class="pun">(</span><span class="typ">BigDecimal</span><span class="pun">)</span><span class="pln"> any</span><span class="pun">(),</span><span class="pln"> anyInt</span><span class="pun">())).</span><span class="pln">thenReturn</span><span class="pun">(</span><span class="typ">ImmutableSet</span><span class="pun">.</span><span class="pln">copyOf</span><span class="pun">(</span><span class="pln">totVisists</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="lit">@Test</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> testPerf</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">long</span><span class="pln"> averageTraditional </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0l</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">long</span><span class="pln"> averageFuntional </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0l</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> a </span><span class="pun"><</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln"> a</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">long</span><span class="pln"> start </span><span class="pun">=</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="pln">currentTimeMillis</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
expressionConverter</span><span class="pun">.</span><span class="pln">convertVisitTimeExpressionTraditional</span><span class="pun">(</span><span class="pln">EXPRESSIONS</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Traditional java "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="typ">System</span><span class="pun">.</span><span class="pln">currentTimeMillis</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> start</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">" ms"</span><span class="pun">);</span><span class="pln">
averageTraditional </span><span class="pun">+=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">System</span><span class="pun">.</span><span class="pln">currentTimeMillis</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> start</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">long</span><span class="pln"> start2 </span><span class="pun">=</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="pln">currentTimeMillis</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
expressionConverter</span><span class="pun">.</span><span class="pln">convertVisitTimeExpressionFunctional</span><span class="pun">(</span><span class="pln">EXPRESSIONS</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Functional java "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="typ">System</span><span class="pun">.</span><span class="pln">currentTimeMillis</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> start2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">" ms"</span><span class="pun">);</span><span class="pln">
averageFuntional </span><span class="pun">+=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">System</span><span class="pun">.</span><span class="pln">currentTimeMillis</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> start2</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Average Traditional java : "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">averageTraditional </span><span class="pun">/</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">" ms"</span><span class="pun">);</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Average Functional java : "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">averageFuntional </span><span class="pun">/</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">" ms"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>
<pre class="prettyprint"><span class="pun"> </span></pre>
<pre class="prettyprint"><span class="pun"> </span></pre>
And this is the output :<br />
Traditional java 1274 ms<br />
Functional java 773 ms<br />
Traditional java 1054 ms<br />
Functional java 531 ms<br />
Traditional java 961 ms<br />
Functional java 493 ms<br />
Traditional java 948 ms<br />
Functional java 492 ms<br />
Traditional java 949 ms<br />
Functional java 491 ms<br />
Traditional java 958 ms<br />
Functional java 481 ms<br />
Traditional java 1004 ms<br />
Functional java 474 ms<br />
Traditional java 949 ms<br />
Functional java 471 ms<br />
Traditional java 947 ms<br />
Functional java 475 ms<br />
Traditional java 942 ms<br />
Functional java 472 ms<br />
Average Traditional java : 998 ms<br />
Average Functional java : 515 ms<br />
<br />
<br />
Functional is 2 times faster than Traditional. Why?<br />
<br />
Because of this : parallelStream()<br />
Parallel Stream will split the job in several tasks leveraging your multicore system.<br />
So can you put parallelStream() everywhere and replace all the stream() methods with parallelStream() ??<br />
<span style="font-size: x-large;"></span><br />
<span style="font-size: x-large;">No!</span><br />
The parallelStream()can in fact cause a big degradation of performance if used in the wrong place.<br />
There are loads of posts out there on this argument that should be read before using this feature, but just remember, if you want to use parallelStream() make sure to measure the performance before and after!!!!!!!!!!<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<pre class="prettyprint"><span class="pun"> </span></pre>
<pre class="prettyprint"><span class="pun"> </span></pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-54367922532771486122014-06-19T11:42:00.000+01:002014-06-19T11:42:04.374+01:00How to test circular dependencies in SpringThis will raise an exception if your dependencies have circular dependency problem<br />
<br />
<pre class="prettyprint"><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">junit</span><span class="pun">.</span><span class="typ">Test</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">springframework</span><span class="pun">.</span><span class="pln">context</span><span class="pun">.</span><span class="pln">support</span><span class="pun">.</span><span class="typ">ClassPathXmlApplicationContext</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">IngesterCircularReferencesTest</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="lit">@Test</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> circularReferencesTest</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">ClassPathXmlApplicationContext</span><span class="pln"> context </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ClassPathXmlApplicationContext</span><span class="pun">();</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">setAllowCircularReferences</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">);</span><span class="pln">
</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> configLocations </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="str">"/your-beans.xml"</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">setConfigLocations</span><span class="pun">(</span><span class="pln">configLocations</span><span class="pun">);</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">refresh</span><span class="pun">();</span><span class="pln">
context</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-68973323699603436992014-05-06T16:11:00.000+01:002014-05-06T16:21:54.433+01:00Happy customer cocktail recipe <h2>
<span style="font-size: x-large;">Ingredients</span> </h2>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-RPLTDSqT4d4/U2jqwd2jfjI/AAAAAAAAA5A/EdE5wIIQfog/s1600/mixtech.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-RPLTDSqT4d4/U2jqwd2jfjI/AAAAAAAAA5A/EdE5wIIQfog/s1600/mixtech.png" height="428" width="640" /></a></div>
<h2 style="clear: both; text-align: left;">
<span style="font-size: x-large;">Recipe</span> </h2>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;">1 - Take a bit of Kanaban, Scrum retrospectives, XP practices and mix well.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Q-tbE4Bg1Ds/U2jrPaH5CpI/AAAAAAAAA5M/1o2w_Se-cfo/s1600/bigger-blender-md.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-Q-tbE4Bg1Ds/U2jrPaH5CpI/AAAAAAAAA5M/1o2w_Se-cfo/s1600/bigger-blender-md.png" style="cursor: move;" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;">2 - Setup your board. ( You will need an electronic board, so choose between <a href="https://www.atlassian.com/software/jira/agile%E2%80%8E" target="_blank">JIRA agile</a> , <a href="http://www.versionone.com/" target="_blank">Versionone</a> , <a href="http://leankit.com/" target="_blank">Leankit</a> , etc. Remember, it's not about how big it is, but how you use it ).</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;">3 - Setup Jenkins. You will need to build the following <a href="https://wiki.jenkins-ci.org/display/JENKINS/Build+Pipeline+Plugin" target="_blank">pipelines</a> : </span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<u style="text-align: center;"><i>The following to run after every commit.</i></u></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<b>Continuous build job</b> : this is triggered every time there is a commit. It runs unit and acceptance tests against trunk.<br />
<div>
<br /></div>
<div>
<b>Sonar job</b> : If the above passed, then it's time to check the quality of the code committed. You can use <a href="http://www.sonarqube.org/" target="_blank">sonar</a> and the <a href="https://wiki.jenkins-ci.org/display/JENKINS/Sonar+plugin" target="_blank">sonar plugin for Jenkins</a>.<br />
<div>
<u style="text-align: center;"><i><br /></i></u></div>
<div>
<u style="text-align: center;"><i>The following to run every night, each depends on the success of the previous.</i></u><br />
<div style="text-align: center;">
<u><i><br /></i></u></div>
<b style="text-align: center;">Continuous build job</b><span style="text-align: center;"> : yes again, no point in running the following if this fails.</span></div>
<div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<b>Release job</b> : <span style="text-align: center;">this creates a production release (<a href="https://wiki.jenkins-ci.org/display/JENKINS/M2+Release+Plugin" target="_blank">maven release</a> or whatever is your company policy about releases) out of your trunk(svn)/master(git) branch.</span></div>
<b><br /></b>
<br />
<div>
<b>Deploy to dev job</b> : This job automatically deploys to dev environments.<br />
<b><br /></b></div>
<div>
<b>Dev System tests job</b> : This will trigger your integration tests against dev environments.<br />
<b><br /></b></div>
<div>
<b>Deploy to perf job </b>: This job automatically deploys to performance environments.<br />
<b><br /></b></div>
<div>
<b>Performance tests job</b> : This run your <a href="http://jmeter.apache.org/" target="_blank">JMeter</a> tests against perf using the <a href="https://wiki.jenkins-ci.org/display/JENKINS/Performance+Plugin" target="_blank">permormance jenkins plugin</a>.<br />
<div>
<br /></div>
<div>
<br />
<div>
<span style="font-size: large;">4 - Each business story will need to follow this process :</span></div>
<div>
<br /></div>
<div>
<b>Pair</b> : If the story is not trivial, do pair programming. It will speedup development and it will reduce dramatically the number of bugs.</div>
<div>
<br /></div>
<div>
<b>Distill the story</b> : Sit with your pair, QA and the Product Owner and write down all the acceptance criteria. <a href="http://mysoftwarequality.wordpress.com/2013/11/12/when-something-works-share-it/" target="_blank">Ask questions here and try to cover all possible scenario</a>. </div>
<div>
<br /></div>
<div>
<b>ATDD</b> : Write acceptance tests first. It will not compile at first because you do not have any implementation, so write the interfaces that you need in order to make the project to compile. Run the test, it will still fail. </div>
<div>
<br /></div>
<div>
<b>TDD</b> : Now write the test for the most external part of your code. (<a href="http://rdafbn.blogspot.fr/2012/08/these-are-just-some-tips-and-tricks-i.html" target="_blank">implement leaves first</a>). Run the test. Implement the code to make the test pass. Test more. Implement more. Continue until the story is fully tested and implemented.</div>
<div>
<br /></div>
<div>
<b>ATDD</b> : Re run your existing acceptance tests. They should pass now.</div>
<div>
<br /></div>
<div>
<b>Review</b> : Submit the code for review. Once the code has been reviewed you can commit.</div>
<div>
<br /></div>
<div>
<b>Sonar</b> : wait for Sonar to tell you how good you and your pair are.</div>
<div>
<br /></div>
<div>
<span style="font-size: large;">5 - After the Jenkins nightly pipeline is successful completed, the QA team can pick up the Release and they can deploy to their QA environment. QA will run manual, automate and exploratory tests and if bugs have been found, developers need to act immediately. </span></div>
<div>
<span style="font-size: large;"><br /></span></div>
<div>
<span style="font-size: large;">6 - When QAs do not find bugs, the release can be deployed into UAT where the Product owners can verify and accept the stories.</span></div>
<div>
<span style="font-size: large;"><br /></span></div>
<div>
<span style="font-size: large;">7 - Once POs are happy, Ops team can deploy to Preprod in order to test the deployment scripts and the deployment instructions.</span></div>
<div>
<span style="font-size: large;"><br /></span></div>
<div>
<span style="font-size: large;">8 - Ops can deploy the release in production.</span></div>
<div>
<br /></div>
<div>
</div>
<div>
Happy customers can celebrate now.</div>
<div>
<br /></div>
<div>
<img src="http://static5.bornrichimages.com/cdn/540/426/70/wp-content/uploads/s3/1/2012/10/15/worlds_most_expensive_cocktail_created_by_salvatore_calabrese_at_london_playboy_club_costs_5500_ij1iz.jpg" height="254" width="320" /> </div>
<div>
</div>
<div>
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
</div>
</div>
</div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-24403840277950762142014-05-02T15:53:00.002+01:002014-05-02T16:31:13.154+01:00Why you should not work extra hours There are pros and cons in working extra hours or over time regularly, here is an attempt to list them all. Some are well known, some are taken from my experience, if you know other reasons just comment and I'll include them in the list.<br />
<br />
<h2 style="text-align: center;">
<u><span style="font-size: x-large;">CONS</span>:</u></h2>
<br />
<span style="font-size: large;"><b>You are going to introduce bugs </b></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-UTiKh1wZGLo/U2Nijs_Gc5I/AAAAAAAAA1Q/rAt5_6K1mHM/s1600/bVkZi3B.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-UTiKh1wZGLo/U2Nijs_Gc5I/AAAAAAAAA1Q/rAt5_6K1mHM/s1600/bVkZi3B.gif" height="172" width="320" /></a></div>
<br />
Human concentration does not last for long time, and it decreases drastically if your brain doesn't rest properly.<br />
We are already introducing bugs when we are extremely focused and well rested in the morning, so it's easy to imagine the disaster that can happen at 10PM.<br />
8 hours of mental work a day is more than enough for your brain.<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>Your changes cannot be promptly reviewed </b></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-bQutxiizr48/U2Nl-5LCLMI/AAAAAAAAA1c/vhu657yXn1M/s1600/enhanced-buzz-30149-1390858215-15.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-bQutxiizr48/U2Nl-5LCLMI/AAAAAAAAA1c/vhu657yXn1M/s1600/enhanced-buzz-30149-1390858215-15.jpg" height="199" width="200" /></a></div>
Code reviews is an extremely powerful tool that is widely used by team in order to control code quality. It works perfectly when reviews are done immediately and you can talk face to face with your team members. It works well when it's done using tools like Gerrit, Reviewboard and so on. It works bad if every morning there are tons of lines of code to review because of nightly or extra hours commits.<br />
<br />
<br />
<span style="font-size: large;"><b><br /></b></span>
<span style="font-size: large;"><b></b></span><br />
<span style="font-size: large;"><b></b></span><br />
<span style="font-size: large;"><b></b></span><br />
<span style="font-size: large;"><b></b></span>
<span style="font-size: large;"><b>Stories team estimation goes wild</b></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-size: large;"><b><a href="http://4.bp.blogspot.com/-dDMhyz6Ib-s/U2N6D-zXfXI/AAAAAAAAA1s/BvHFnHIvxT8/s1600/92767.strip.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-dDMhyz6Ib-s/U2N6D-zXfXI/AAAAAAAAA1s/BvHFnHIvxT8/s1600/92767.strip.gif" height="123" width="400" /></a></b></span></div>
<br />
One of the most painful part of any agile team is the stories estimation (less in Kanban, more in Scrum). It is painful, stressful, long and it is tiring for all the participants. Estimations are based on stories complexity and time. The time is the 8 hours per 5 days a week. Now, all this estimation gets distorted and so useless when team members regularly work extra hours. Team will get frustrated.<br />
<br />
<br />
<span style="font-size: large;"><b>You can create tension between team members</b></span><br />
<span style="font-size: large;"><b></b></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-YnPe1LRRNxs/U2OhV2vRZ0I/AAAAAAAAA18/Uf_f5g-Zlq4/s1600/canvas.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-tu29Gufd3o0/U2OiZTfoF_I/AAAAAAAAA2I/Tqr7noY1KcA/s1600/anigif_enhanced-buzz-21029-1384455707-19.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-tu29Gufd3o0/U2OiZTfoF_I/AAAAAAAAA2I/Tqr7noY1KcA/s1600/anigif_enhanced-buzz-21029-1384455707-19.gif" height="122" width="200" /></a></div>
One thing I noticed in teams where some members work over time, is the presence of hostilities and tension. Why is that? People that follow regular work hours can be worried about their career being compromised because they do not stay longer in the office. People who work late can see the others as non involved/interested enough on the job. Solution? simple, stick on regular hours. <br />
<span style="font-size: large;"><b><br /></b></span>
<span style="font-size: large;"></span><br />
<span style="font-size: large;"><b><br /></b></span>
<span style="font-size: large;"></span><br />
<span style="font-size: large;"><b></b></span>
<span style="font-size: large;"><b>You create wrong expectations</b></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-LGkZYYhGRgo/U2OvS7bA0FI/AAAAAAAAA2Y/Og2Y0jGmCpg/s1600/bossw.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-LGkZYYhGRgo/U2OvS7bA0FI/AAAAAAAAA2Y/Og2Y0jGmCpg/s1600/bossw.jpg" height="171" width="320" /></a></div>
Everyone knows, you give a hand and they want your arm. You work regularly over time and your manager will start soon to expect and to count on you to stay late.<br />
<span style="font-size: large;"><b><br /></b></span>
<span style="font-size: large;"><b><br /></b></span>
<span style="font-size: large;"><b><br /></b></span>
<span style="font-size: large;"><b><br /></b></span>
<span style="font-size: large;"><b></b></span><br />
<span style="font-size: large;"><b><br /></b></span>
<span style="font-size: large;"><b>You lose a great part of your life</b></span><br />
<br />
<a href="http://3.bp.blogspot.com/-zuSbb_VWups/U2OwNcuBTCI/AAAAAAAAA2g/2hhVgAh9m10/s1600/missgirls.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-zuSbb_VWups/U2OwNcuBTCI/AAAAAAAAA2g/2hhVgAh9m10/s1600/missgirls.jpg" height="220" width="400" /></a><span style="font-size: large;"><b></b></span>Yep.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<h2 style="text-align: center;">
<span style="font-size: x-large;"><u>PROS:</u></span></h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-wbWP-JZAxPw/U2OxN9dUyLI/AAAAAAAAA2s/wugj_GrzAaA/s1600/giphy.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-wbWP-JZAxPw/U2OxN9dUyLI/AAAAAAAAA2s/wugj_GrzAaA/s1600/giphy.gif" /></a></div>
<h2>
</h2>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-17138053545146851672014-04-27T14:52:00.000+01:002014-04-27T17:15:56.872+01:00Software developers by nationalitiesIn the last 12 years I worked closely with lots of developers coming from lots of different countries.<br />
I though to put together a post, trying to describe the commonalities and differences I found between skills and nationalities, but then I thought It would be funnier and better(I'm lazy today) to create a simple survey and ask the developers out there and so here we go:<br />
<br />
<iframe frameborder="0" height="500" marginheight="0" marginwidth="0" src="https://docs.google.com/forms/d/1uSK6dxQAG1zYdzWVDxyVbpTI_HmH8nNjQqn5rzLa30A/viewform?embedded=true" width="760">Loading...</iframe>
<iframe frameborder="0" height="500" src="https://docs.google.com/spreadsheet/pub?key=0ApiFoRqFT4pZdER1NkM0T1k2R0hnVzlXQURrSWVFTnc&single=true&gid=3&output=html&widget=true" width="760"></iframe>
<br />
<h4>
<a href="https://docs.google.com/spreadsheet/ccc?key=0ApiFoRqFT4pZdER1NkM0T1k2R0hnVzlXQURrSWVFTnc&usp=sharing#gid=3" target="_blank"><b><span style="font-size: large;">See result on line</span></b></a></h4>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-33003610288083888582014-01-30T17:41:00.003+00:002014-01-31T12:52:33.717+00:00Bugs types<h3>
<span style="font-size: large;"><code><span class="typ"><code><span class="pln">Incompatible</span><span class="pun"></span></code> classes</span></code></span></h3>
when you try to deserialize files generated with old code...<br />
<a href="http://static.mmzstatic.com/wp-content/uploads/2014/01/130114-18.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Les trouvailles dInternet pour bien commencer la semaine #161 130114 18" border="0" class="aligncenter size-full wp-image-223521" src="http://static.mmzstatic.com/wp-content/uploads/2014/01/130114-18.jpg" height="448" title="130114-18" width="599" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<h3>
<span style="font-size: large;"><code><span class="typ"><code><span class="pln">Wrong URL setting</span></code></span></code></span></h3>
when you put a wrong rest url in your property file and you receive no messages...<br />
<img alt="Les trouvailles dInternet pour bien commencer la semaine #160 060114 6" class="aligncenter size-full wp-image-221649" src="http://static.mmzstatic.com/wp-content/uploads/2014/01/060114-6.gif" height="181" title="060114-6" width="400" /><br />
<br />
<br />
<br />
<h3>
<span style="font-size: large;"><code><span class="typ"><code><span class="pln">Too verbose xml messages</span></code></span></code></span></h3>
when SLAs are not met because your XML messages are too big wasting time in serialization and deserialization...<br />
<img alt="Les trouvailles dInternet pour bien commencer la semaine #162 200114 15" class="aligncenter size-full wp-image-225235" src="http://static.mmzstatic.com/wp-content/uploads/2014/01/200114-15.gif" height="127" title="200114-15" width="200" /><br />
<br />
<br />
<br />
<br />
<br />
<h3>
<span style="font-size: large;"><code><span class="typ"><code><span class="pln">Production with no tests</span></code></span></code></span></h3>
when you go in production and you expect that everything will go fine even if you didn't test all the possible paths...<br />
<br />
<a href="http://static.mmzstatic.com/wp-content/uploads/2014/01/200114-23.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Les trouvailles dInternet pour bien commencer la semaine #162 200114 23" border="0" class="aligncenter size-full wp-image-225248" src="http://static.mmzstatic.com/wp-content/uploads/2014/01/200114-23.gif" height="148" title="200114-23" width="200" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<h3>
<span style="font-size: large;"><code><span class="typ"><code><span class="pln"> </span></code></span></code></span></h3>
<h3>
<span style="font-size: large;"><code><span class="typ"><code><span class="pln"> </span></code></span></code></span></h3>
<h3>
<span style="font-size: large;"><code><span class="typ"><code><span class="pln"> </span></code></span></code></span></h3>
<h3>
<code><span style="font-size: large;">Too many requests</span></code><span style="font-size: large;"><code><span class="typ">, site is down</span></code></span></h3>
when you go in production without never running stress tests before...<br />
<img alt="Les trouvailles dInternet pour bien commencer la semaine #158 161213 11" class="aligncenter size-full wp-image-218004" src="http://static.mmzstatic.com/wp-content/uploads/2013/12/161213-11.gif" height="181" title="161213-11" width="220" /><br />
<br />
<br />
<br />
<h3>
<code><span style="font-size: large;">Threads</span></code><span style="font-size: large;"><code><span class="typ"> bottleneck</span></code></span></h3>
when you spawn threads and you think it will be faster, but you forgot that synchronized method...<br />
<img alt="Les trouvailles dInternet pour bien commencer la semaine #158 161213 20" class="aligncenter size-full wp-image-218030" src="http://static.mmzstatic.com/wp-content/uploads/2013/12/161213-20.gif" height="180" title="161213-20" width="320" /> <br />
<br />
<br />
<br />
<br />
<h3>
<code><span style="font-size: large;">Threads</span></code><span style="font-size: large;"><code><span class="typ"> interference</span></code></span></h3>
when you forgot to coordinate your threads...<br />
<img alt="Les trouvailles dInternet pour bien commencer la semaine #154 181113 25" class="size-full wp-image-212315 aligncenter" src="http://static.mmzstatic.com/wp-content/uploads/2013/11/181113-25.gif" height="197" title="181113-25" width="288" /> <br />
<br />
<br />
<br />
<br />
<br />
<h3>
<code><span style="font-size: large;">Bug in an external library</span></code><span style="font-size: large;"><code><span class="typ"><br /></span></code></span></h3>
when that external library that you choose is not behaving as expected...<br />
<img alt="Les trouvailles dInternet pour bien commencer la semaine #153 121113 22" class="aligncenter size-full wp-image-211086" src="http://static.mmzstatic.com/wp-content/uploads/2013/11/121113-22.gif" height="297" title="121113-22" width="400" /> <br />
<br />
<br />
<br />
<br />
<h3>
<code><span style="font-size: large;">Wrong usage of a library</span></code><span style="font-size: large;"><code><span class="typ"> </span></code></span></h3>
when you tried to use a library without reading the documentation...<br />
<img alt="http://i.imgur.com/nJdP4.gif" class="decoded" src="http://i.imgur.com/nJdP4.gif" /> <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-57756446871500051672014-01-30T12:32:00.000+00:002014-01-30T12:35:54.885+00:00Access private fields in unit testsFirst of all, let me say out louder, <span style="font-size: large;">you need to design your code to be testable, so you test your private fields through your public methods. </span><br />
<br />
But, ("buts" are the reasons why humans are still programming instead of the computer itself, so be happy here) sometimes you want to and should alter some private fields in order to test all the possible boundaries.<br />
Often private fields can be modified through public getter and setters or using the class constructor and in those cases the tests are easy to create and everybody is happy.<br />
But when you use external frameworks like Spring, it may be possible that you do not have control over injected private fields.<br />
I already explain<a href="http://rdafbn.blogspot.com/2014/01/testing-spring-components-with-mockito.html" target="_blank"> how to mock spring components in your tests without the need of maintaining and creating ad-hoc test spring configuraitons</a> in a previous post, here I will show you how to modify a private variable for your tests.<br />
<br />
Let speak code:<br />
<br />
<br />
<pre class="prettyprint"><span class="kwd">import</span><span class="pln"> javax</span><span class="pun">.</span><span class="pln">annotation</span><span class="pun">.</span><span class="typ">PostConstruct</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">springframework</span><span class="pun">.</span><span class="pln">beans</span><span class="pun">.</span><span class="pln">factory</span><span class="pun">.</span><span class="pln">annotation</span><span class="pun">.</span><span class="typ">Value</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">springframework</span><span class="pun">.</span><span class="pln">stereotype</span><span class="pun">.</span><span class="typ">Service</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">google</span><span class="pun">.</span><span class="pln">common</span><span class="pun">.</span><span class="pln">collect</span><span class="pun">.</span><span class="typ">ImmutableSet</span><span class="pun">;</span><span class="pln">
</span><span class="lit">@Service</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">SomeService</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="lit">@Value</span><span class="pun">(</span><span class="str">"${whitelist.api.users:A,B,C}"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> apiUsers</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ImmutableSet</span><span class="pun"><</span><span class="typ">String</span><span class="pun">></span><span class="pln"> acceptableAPIBUsers</span><span class="pun">;</span><span class="pln">
</span><span class="lit">@PostConstruct</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> init</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
acceptableAPIBUsers </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ImmutableSet</span><span class="pun">.</span><span class="pln">copyOf</span><span class="pun">(</span><span class="pln">apiUsers</span><span class="pun">.</span><span class="pln">replaceAll</span><span class="pun">(</span><span class="str">" "</span><span class="pun">,</span><span class="pln"> </span><span class="str">""</span><span class="pun">).</span><span class="pln">split</span><span class="pun">(</span><span class="str">","</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">boolean</span><span class="pln"> isAnAcceptableUser</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> user</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> user </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">null</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="kwd">false</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> acceptableAPIBUsers</span><span class="pun">.</span><span class="pln">contains</span><span class="pun">(</span><span class="pln">user</span><span class="pun">.</span><span class="pln">toUpperCase</span><span class="pun">());</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>
<br />
<br />
We do not have control over the apiUsers String, so we have couple of straightforward options, one is to create a Spring configuration for your test, modify the Spring context and mock the property, two is to create a setter to change the value of the property from your test.<br />
I discourage from creating public assessors only for you tests, it is confusing for other people looking at your code and creating and maintaing Spring configurations for your tests can be a pain. <br />
<br />
I know what you are thinking, "if I cannot do either of the above I'm going to get fired, my girlfriend will leave me and my life is finished", but don't you worry, I'm here to show you another option ;)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-NxYuZIi6eSA/UupFDJb3FYI/AAAAAAAAA0o/9a4A8tKnqzI/s1600/proceed.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-NxYuZIi6eSA/UupFDJb3FYI/AAAAAAAAA0o/9a4A8tKnqzI/s1600/proceed.gif" /></a></div>
<br />
<br />
You can create a groovy class with a static method to assess your private field in your test :<br />
<br />
<br />
<pre class="prettyprint"><span class="kwd">import</span><span class="pln"> groovy</span><span class="pun">.</span><span class="pln">transform</span><span class="pun">.</span><span class="typ">CompileStatic</span><span class="pln">
</span><span class="lit">@CompileStatic</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">SomeServiceAccessor</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setApiUsers</span><span class="pun">(</span><span class="typ">SomeService</span><span class="pln"> someService</span><span class="pun">,</span><span class="typ">String</span><span class="pln"> apiUsers</span><span class="pun">){</span><span class="pln">
someService</span><span class="pun">.</span><span class="lit">@apiUsers</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> apiUsers
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>
<br />
And use it in your unit test:<br />
<br />
<pre class="prettyprint"><span class="kwd">import</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">hamcrest</span><span class="pun">.</span><span class="typ">CoreMatchers</span><span class="pun">.</span><span class="kwd">is</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">junit</span><span class="pun">.</span><span class="typ">Assert</span><span class="pun">.</span><span class="pln">assertThat</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">junit</span><span class="pun">.</span><span class="typ">Before</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">junit</span><span class="pun">.</span><span class="typ">Test</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">SomeServiceTest</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">SomeService</span><span class="pln"> service</span><span class="pun">;</span><span class="pln">
</span><span class="lit">@Before</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setUp</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
service </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SomeSercvice</span><span class="pun">();</span><span class="pln">
</span><span class="typ">SomeSercviceAccessor</span><span class="pun">.</span><span class="pln">setApiUsers</span><span class="pun">(</span><span class="pln">service</span><span class="pun">,</span><span class="pln"> </span><span class="str">"pippo,pluto,bungabunga"</span><span class="pun">);</span><span class="pln">
service</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="lit">@Test</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> testIsNotApiUser</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
assertThat</span><span class="pun">(</span><span class="pln">service</span><span class="pun">.</span><span class="pln">isAnRTBUser</span><span class="pun">(</span><span class="str">""</span><span class="pun">),</span><span class="pln"> </span><span class="kwd">is</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">));</span><span class="pln">
assertThat</span><span class="pun">(</span><span class="pln">service</span><span class="pun">.</span><span class="pln">isAnRTBUser</span><span class="pun">(</span><span class="kwd">null</span><span class="pun">),</span><span class="pln"> </span><span class="kwd">is</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">));</span><span class="pln">
assertThat</span><span class="pun">(</span><span class="pln">service</span><span class="pun">.</span><span class="pln">isAnRTBUser</span><span class="pun">(</span><span class="str">"random"</span><span class="pun">),</span><span class="pln"> </span><span class="kwd">is</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="lit">@Test</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> testIsRTBUser</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
assertThat</span><span class="pun">(</span><span class="pln">service</span><span class="pun">.</span><span class="pln">isAnRTBUser</span><span class="pun">(</span><span class="str">"pippo"</span><span class="pun">),</span><span class="pln"> </span><span class="kwd">is</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">));</span><span class="pln">
assertThat</span><span class="pun">(</span><span class="pln">service</span><span class="pun">.</span><span class="pln">isAnRTBUser</span><span class="pun">(</span><span class="str">"PIPPO"</span><span class="pun">),</span><span class="pln"> </span><span class="kwd">is</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">));</span><span class="pln">
assertThat</span><span class="pun">(</span><span class="pln">service</span><span class="pun">.</span><span class="pln">isAnRTBUser</span><span class="pun">(</span><span class="str">"pluto"</span><span class="pun">),</span><span class="pln"> </span><span class="kwd">is</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">));</span><span class="pln">
assertThat</span><span class="pun">(</span><span class="pln">service</span><span class="pun">.</span><span class="pln">isAnRTBUser</span><span class="pun">(</span><span class="str">"bungabunga"</span><span class="pun">),</span><span class="pln"> </span><span class="kwd">is</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span></pre>
<br />
Of course you can do the same in java changing the visibility of the field with reflection, but I think the groovy solution can be a cleaner and easier way.<br />
<br />
Now, I ll finish this post with the following recommendation:<br />
<br />
<u><b>Do not use this solution unless you really really really need to modify private variables to unit test your class! </b></u><br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6243670623010502252.post-55065977923448625672014-01-15T14:17:00.001+00:002014-05-07T10:24:44.634+01:00Testing Spring components with MockitoBe able to unit test your spring components without the need of loading the full spring-context with its ad-hoc test configurations it is ,in my opinion, a great advantage because it's clean, easy to maintain, faster to write, smooth to alter.<br />
<br />
A way to achieve this goal is to use <a href="http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html" target="_blank">Mockito</a> and tell him to replace the @Autowired components in the class you want to test, with Mocks ( or Spies ).<br />
<br />
Here an example.<br />
We have a service called SalaryService that guess what, is calculating a hypothetical net salary based on the employee id passed. Easy concept. <br />
<br />
The service required two collaborators, one, the EmployeeDAO, to retrieve the gross salary and a second one, the TaxCalculator, to apply some taxes based on the gross salary.<br />
<br />
<pre class="prettyprint" style="background-color: #eeeeee; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; max-width: 70em; overflow: auto; padding: 0.5em;"><span class="kwd" style="color: #000088;">package</span><span class="pln"> com</span><span class="pun" style="color: #666600;">.</span><span class="pln">marco</span><span class="pun" style="color: #666600;">.</span><span class="pln">springmockito</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> java</span><span class="pun" style="color: #666600;">.</span><span class="pln">math</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> org</span><span class="pun" style="color: #666600;">.</span><span class="pln">springframework</span><span class="pun" style="color: #666600;">.</span><span class="pln">beans</span><span class="pun" style="color: #666600;">.</span><span class="pln">factory</span><span class="pun" style="color: #666600;">.</span><span class="pln">annotation</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">Autowired</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> org</span><span class="pun" style="color: #666600;">.</span><span class="pln">springframework</span><span class="pun" style="color: #666600;">.</span><span class="pln">stereotype</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">Component</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="lit" style="color: #006666;">@Component</span><span class="pln">
</span><span class="kwd" style="color: #000088;">public</span><span class="pln"> </span><span class="kwd" style="color: #000088;">class</span><span class="pln"> </span><span class="typ" style="color: #660066;">SalaryService</span><span class="pln"> </span><span class="pun" style="color: #666600;">{</span><span class="pln">
</span><span class="kwd" style="color: #000088;">private</span><span class="pln"> </span><span class="kwd" style="color: #000088;">static</span><span class="pln"> </span><span class="kwd" style="color: #000088;">final</span><span class="pln"> </span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pln"> minimumSalary </span><span class="pun" style="color: #666600;">=</span><span class="pln"> </span><span class="kwd" style="color: #000088;">new</span><span class="pln"> </span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pun" style="color: #666600;">(</span><span class="lit" style="color: #006666;">20000</span><span class="pun" style="color: #666600;">);</span><span class="pln">
</span><span class="lit" style="color: #006666;">@Autowired</span><span class="pln">
</span><span class="kwd" style="color: #000088;">private</span><span class="pln"> </span><span class="typ" style="color: #660066;">EmployeeDAO</span><span class="pln"> employeeDAO</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="lit" style="color: #006666;">@Autowired</span><span class="pln">
</span><span class="kwd" style="color: #000088;">private</span><span class="pln"> </span><span class="typ" style="color: #660066;">TaxCalculator</span><span class="pln"> taxCalculator</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">public</span><span class="pln"> </span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pln"> getNetSalary</span><span class="pun" style="color: #666600;">(</span><span class="kwd" style="color: #000088;">long</span><span class="pln"> employeeId</span><span class="pun" style="color: #666600;">)</span><span class="pln"> </span><span class="pun" style="color: #666600;">{</span><span class="pln">
</span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pln"> netSalary </span><span class="pun" style="color: #666600;">=</span><span class="pln"> </span><span class="kwd" style="color: #000088;">null</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pln"> grossSalary </span><span class="pun" style="color: #666600;">=</span><span class="pln"> employeeDAO</span><span class="pun" style="color: #666600;">.</span><span class="pln">getAnnualSalary</span><span class="pun" style="color: #666600;">(</span><span class="pln">employeeId</span><span class="pun" style="color: #666600;">);</span><span class="pln">
</span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pln"> taxes </span><span class="pun" style="color: #666600;">=</span><span class="pln"> taxCalculator</span><span class="pun" style="color: #666600;">.</span><span class="pln">calculateTaxes</span><span class="pun" style="color: #666600;">(</span><span class="pln">grossSalary</span><span class="pun" style="color: #666600;">);</span><span class="pln">
</span><span class="kwd" style="color: #000088;">if</span><span class="pln"> </span><span class="pun" style="color: #666600;">(</span><span class="pln">taxedSalaryIsGreaterThanMinimumSalary</span><span class="pun" style="color: #666600;">(</span><span class="pln">grossSalary</span><span class="pun" style="color: #666600;">))</span><span class="pln"> </span><span class="pun" style="color: #666600;">{</span><span class="pln">
netSalary </span><span class="pun" style="color: #666600;">=</span><span class="pln"> grossSalary</span><span class="pun" style="color: #666600;">.</span><span class="pln">subtract</span><span class="pun" style="color: #666600;">(</span><span class="pln">taxes</span><span class="pun" style="color: #666600;">);</span><span class="pln">
</span><span class="pun" style="color: #666600;">}</span><span class="pln"> </span><span class="kwd" style="color: #000088;">else</span><span class="pln"> </span><span class="pun" style="color: #666600;">{</span><span class="pln">
netSalary </span><span class="pun" style="color: #666600;">=</span><span class="pln"> grossSalary</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="pun" style="color: #666600;">}</span><span class="pln">
</span><span class="kwd" style="color: #000088;">return</span><span class="pln"> netSalary</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="pun" style="color: #666600;">}</span><span class="pln">
</span><span class="kwd" style="color: #000088;">private</span><span class="pln"> </span><span class="kwd" style="color: #000088;">boolean</span><span class="pln"> taxedSalaryIsGreaterThanMinimumSalary</span><span class="pun" style="color: #666600;">(</span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pln"> taxedSalary</span><span class="pun" style="color: #666600;">)</span><span class="pln"> </span><span class="pun" style="color: #666600;">{</span><span class="pln">
</span><span class="kwd" style="color: #000088;">return</span><span class="pln"> taxedSalary</span><span class="pun" style="color: #666600;">.</span><span class="pln">compareTo</span><span class="pun" style="color: #666600;">(</span><span class="pln">minimumSalary</span><span class="pun" style="color: #666600;">)</span><span class="pln"> </span><span class="pun" style="color: #666600;">==</span><span class="pln"> </span><span class="lit" style="color: #006666;">1</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="pun" style="color: #666600;">}</span><span class="pln">
</span><span class="pun" style="color: #666600;">}</span></pre>
<br />
<br />
EmployeeDAO is a classical service that is in charge of retrieving information from a persistence storage and it will look like this more or less.<br />
<br />
<pre class="prettyprint" style="background-color: #eeeeee; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; max-width: 70em; overflow: auto; padding: 0.5em;"><span class="kwd" style="color: #000088;">package</span><span class="pln"> com</span><span class="pun" style="color: #666600;">.</span><span class="pln">marco</span><span class="pun" style="color: #666600;">.</span><span class="pln">springmockito</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> java</span><span class="pun" style="color: #666600;">.</span><span class="pln">math</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> org</span><span class="pun" style="color: #666600;">.</span><span class="pln">springframework</span><span class="pun" style="color: #666600;">.</span><span class="pln">stereotype</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">Component</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="lit" style="color: #006666;">@Component</span><span class="pln">
</span><span class="kwd" style="color: #000088;">public</span><span class="pln"> </span><span class="kwd" style="color: #000088;">class</span><span class="pln"> </span><span class="typ" style="color: #660066;">EmployeeDAO</span><span class="pln"> </span><span class="pun" style="color: #666600;">{</span><span class="pln">
</span><span class="kwd" style="color: #000088;">public</span><span class="pln"> </span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pln"> getAnnualSalary</span><span class="pun" style="color: #666600;">(</span><span class="kwd" style="color: #000088;">long</span><span class="pln"> employeeId</span><span class="pun" style="color: #666600;">)</span><span class="pln"> </span><span class="pun" style="color: #666600;">{</span><span class="pln">
</span><span class="com" style="color: #880000;">// conncetTODB</span><span class="pln">
</span><span class="com" style="color: #880000;">// run select for employeeId;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">return</span><span class="pln"> </span><span class="kwd" style="color: #000088;">new</span><span class="pln"> </span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pun" style="color: #666600;">(</span><span class="lit" style="color: #006666;">70000</span><span class="pun" style="color: #666600;">);</span><span class="pln">
</span><span class="pun" style="color: #666600;">}</span><span class="pln">
</span><span class="pun" style="color: #666600;">}</span></pre>
<br />
<br />
TaxCalculator will need a TaxDao to retrieve taxes information and it will then operate some sort of boring and long calculation in order to return the taxes.<br />
<br />
<pre class="prettyprint" style="background-color: #eeeeee; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; max-width: 70em; overflow: auto; padding: 0.5em;"><span class="kwd" style="color: #000088;">package</span><span class="pln"> com</span><span class="pun" style="color: #666600;">.</span><span class="pln">marco</span><span class="pun" style="color: #666600;">.</span><span class="pln">springmockito</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> java</span><span class="pun" style="color: #666600;">.</span><span class="pln">math</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> org</span><span class="pun" style="color: #666600;">.</span><span class="pln">springframework</span><span class="pun" style="color: #666600;">.</span><span class="pln">beans</span><span class="pun" style="color: #666600;">.</span><span class="pln">factory</span><span class="pun" style="color: #666600;">.</span><span class="pln">annotation</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">Autowired</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> org</span><span class="pun" style="color: #666600;">.</span><span class="pln">springframework</span><span class="pun" style="color: #666600;">.</span><span class="pln">stereotype</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">Component</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="lit" style="color: #006666;">@Component</span><span class="pln">
</span><span class="kwd" style="color: #000088;">public</span><span class="pln"> </span><span class="kwd" style="color: #000088;">class</span><span class="pln"> </span><span class="typ" style="color: #660066;">TaxCalculator</span><span class="pln"> </span><span class="pun" style="color: #666600;">{</span><span class="pln">
</span><span class="lit" style="color: #006666;">@Autowired</span><span class="pln">
</span><span class="kwd" style="color: #000088;">private</span><span class="pln"> </span><span class="typ" style="color: #660066;">TaxDao</span><span class="pln"> taxDao</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">public</span><span class="pln"> </span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pln"> calculateTaxes</span><span class="pun" style="color: #666600;">(</span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pln"> salary</span><span class="pun" style="color: #666600;">)</span><span class="pln"> </span><span class="pun" style="color: #666600;">{</span><span class="pln">
</span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pln"> result </span><span class="pun" style="color: #666600;">=</span><span class="pln"> salary</span><span class="pun" style="color: #666600;">.</span><span class="pln">multiply</span><span class="pun" style="color: #666600;">(</span><span class="pln">taxDao</span><span class="pun" style="color: #666600;">.</span><span class="pln">getTaxPercentageForYear</span><span class="pun" style="color: #666600;">(</span><span class="lit" style="color: #006666;">2014</span><span class="pun" style="color: #666600;">));</span><span class="pln">
</span><span class="com" style="color: #880000;">// some other weird calculation ....</span><span class="pln">
</span><span class="kwd" style="color: #000088;">return</span><span class="pln"> result</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="pun" style="color: #666600;">}</span><span class="pln">
</span><span class="pun" style="color: #666600;">}</span></pre>
<br />
<br />
Now, we want to unit test the SalaryService class. We should not to be bothered by DAOs and databases setup of any sort. In this UNIT test, we don't care here what the TaxCalculator is doing.<br />
<br />
What we want is to test that our SalaryService is behaving as expected and that it is able to correctly use the work of its collaborators.<br />
<br />
Here is how we do it with Mockito. We mark the class we want to test with <a href="http://docs.mockito.googlecode.com/hg/latest/org/mockito/InjectMocks.html" target="_blank">@InjectMocks</a> and we mark with <a href="http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mock.html" target="_blank">@Mock</a> all of its collaborators ( or <a href="http://docs.mockito.googlecode.com/hg/latest/org/mockito/Spy.html" target="_blank">@Spy</a> if you need a real implementation ).<br />
<br />
Lastly we need to tell our Unit framework, to operate the required Mockito injections before starting the test and we do this with <span class="typ" style="color: #660066; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px;">MockitoAnnotations</span><span class="pun" style="color: #666600; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px;">.</span><span class="pln" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px;">initMocks</span><span class="pun" style="color: #666600; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px;">(</span><span class="kwd" style="color: #000088; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px;">this</span><span class="pun" style="color: #666600; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px;">);</span>.<br />
<br />
In the test we need to mock the expected operations so that we can concentrate on the actual logic we want to test inside the SalaryService .<br />
<br />
<pre class="prettyprint" style="background-color: #eeeeee; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; max-width: 70em; overflow: auto; padding: 0.5em;"><span class="kwd" style="color: #000088;">package</span><span class="pln"> com</span><span class="pun" style="color: #666600;">.</span><span class="pln">marco</span><span class="pun" style="color: #666600;">.</span><span class="pln">springmockito</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> </span><span class="kwd" style="color: #000088;">static</span><span class="pln"> org</span><span class="pun" style="color: #666600;">.</span><span class="pln">hamcrest</span><span class="pun" style="color: #666600;">.</span><span class="pln">core</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">Is</span><span class="pun" style="color: #666600;">.</span><span class="kwd" style="color: #000088;">is</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> </span><span class="kwd" style="color: #000088;">static</span><span class="pln"> org</span><span class="pun" style="color: #666600;">.</span><span class="pln">junit</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">Assert</span><span class="pun" style="color: #666600;">.</span><span class="pln">assertThat</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> </span><span class="kwd" style="color: #000088;">static</span><span class="pln"> org</span><span class="pun" style="color: #666600;">.</span><span class="pln">mockito</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">Mockito</span><span class="pun" style="color: #666600;">.</span><span class="kwd" style="color: #000088;">when</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> java</span><span class="pun" style="color: #666600;">.</span><span class="pln">math</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> org</span><span class="pun" style="color: #666600;">.</span><span class="pln">junit</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">Before</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> org</span><span class="pun" style="color: #666600;">.</span><span class="pln">junit</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">Test</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> org</span><span class="pun" style="color: #666600;">.</span><span class="pln">mockito</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">InjectMocks</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> org</span><span class="pun" style="color: #666600;">.</span><span class="pln">mockito</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">Mock</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">import</span><span class="pln"> org</span><span class="pun" style="color: #666600;">.</span><span class="pln">mockito</span><span class="pun" style="color: #666600;">.</span><span class="typ" style="color: #660066;">MockitoAnnotations</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="kwd" style="color: #000088;">public</span><span class="pln"> </span><span class="kwd" style="color: #000088;">class</span><span class="pln"> </span><span class="typ" style="color: #660066;">SalaryServiceTest</span><span class="pln"> </span><span class="pun" style="color: #666600;">{</span><span class="pln">
</span><span class="kwd" style="color: #000088;">private</span><span class="pln"> </span><span class="kwd" style="color: #000088;">static</span><span class="pln"> </span><span class="kwd" style="color: #000088;">final</span><span class="pln"> </span><span class="kwd" style="color: #000088;">long</span><span class="pln"> </span><span class="typ" style="color: #660066;">UserId</span><span class="pln"> </span><span class="pun" style="color: #666600;">=</span><span class="pln"> </span><span class="lit" style="color: #006666;">123l</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="lit" style="color: #006666;">@InjectMocks</span><span class="pln">
</span><span class="kwd" style="color: #000088;">private</span><span class="pln"> </span><span class="typ" style="color: #660066;">SalaryService</span><span class="pln"> salaryService</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="lit" style="color: #006666;">@Mock</span><span class="pln">
</span><span class="kwd" style="color: #000088;">private</span><span class="pln"> </span><span class="typ" style="color: #660066;">EmployeeDAO</span><span class="pln"> employeeDAO</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="lit" style="color: #006666;">@Mock</span><span class="pln">
</span><span class="kwd" style="color: #000088;">private</span><span class="pln"> </span><span class="typ" style="color: #660066;">TaxCalculator</span><span class="pln"> taxCalculator</span><span class="pun" style="color: #666600;">;</span><span class="pln">
</span><span class="lit" style="color: #006666;">@Before</span><span class="pln">
</span><span class="kwd" style="color: #000088;">public</span><span class="pln"> </span><span class="kwd" style="color: #000088;">void</span><span class="pln"> init</span><span class="pun" style="color: #666600;">()</span><span class="pln"> </span><span class="pun" style="color: #666600;">{</span><span class="pln">
</span><span class="typ" style="color: #660066;">MockitoAnnotations</span><span class="pun" style="color: #666600;">.</span><span class="pln">initMocks</span><span class="pun" style="color: #666600;">(</span><span class="kwd" style="color: #000088;">this</span><span class="pun" style="color: #666600;">);</span><span class="pln">
</span><span class="pun" style="color: #666600;">}</span><span class="pln">
</span><span class="lit" style="color: #006666;">@Test</span><span class="pln">
</span><span class="kwd" style="color: #000088;">public</span><span class="pln"> </span><span class="kwd" style="color: #000088;">void</span><span class="pln"> testMinimumSalary</span><span class="pun" style="color: #666600;">()</span><span class="pln"> </span><span class="pun" style="color: #666600;">{</span><span class="pln">
</span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pln"> annualSalary </span><span class="pun" style="color: #666600;">=</span><span class="pln"> </span><span class="kwd" style="color: #000088;">new</span><span class="pln"> </span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pun" style="color: #666600;">(</span><span class="lit" style="color: #006666;">10000</span><span class="pun" style="color: #666600;">);</span><span class="pln">
</span><span class="kwd" style="color: #000088;">when</span><span class="pun" style="color: #666600;">(</span><span class="pln">employeeDAO</span><span class="pun" style="color: #666600;">.</span><span class="pln">getAnnualSalary</span><span class="pun" style="color: #666600;">(</span><span class="typ" style="color: #660066;">UserId</span><span class="pun" style="color: #666600;">)).</span><span class="pln">thenReturn</span><span class="pun" style="color: #666600;">(</span><span class="pln">annualSalary</span><span class="pun" style="color: #666600;">);</span><span class="pln">
</span><span class="kwd" style="color: #000088;">when</span><span class="pun" style="color: #666600;">(</span><span class="pln">taxCalculator</span><span class="pun" style="color: #666600;">.</span><span class="pln">calculateTaxes</span><span class="pun" style="color: #666600;">(</span><span class="pln">annualSalary</span><span class="pun" style="color: #666600;">)).</span><span class="pln">thenReturn</span><span class="pun" style="color: #666600;">(</span><span class="kwd" style="color: #000088;">new</span><span class="pln"> </span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pun" style="color: #666600;">(</span><span class="lit" style="color: #006666;">1000</span><span class="pun" style="color: #666600;">));</span><span class="pln">
</span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pln"> actual </span><span class="pun" style="color: #666600;">=</span><span class="pln"> salaryService</span><span class="pun" style="color: #666600;">.</span><span class="pln">getNetSalary</span><span class="pun" style="color: #666600;">(</span><span class="typ" style="color: #660066;">UserId</span><span class="pun" style="color: #666600;">);</span><span class="pln">
assertThat</span><span class="pun" style="color: #666600;">(</span><span class="pln">actual</span><span class="pun" style="color: #666600;">.</span><span class="pln">compareTo</span><span class="pun" style="color: #666600;">(</span><span class="kwd" style="color: #000088;">new</span><span class="pln"> </span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pun" style="color: #666600;">(</span><span class="lit" style="color: #006666;">10000</span><span class="pun" style="color: #666600;">)),</span><span class="pln"> </span><span class="kwd" style="color: #000088;">is</span><span class="pun" style="color: #666600;">(</span><span class="lit" style="color: #006666;">0</span><span class="pun" style="color: #666600;">));</span><span class="pln">
</span><span class="pun" style="color: #666600;">}</span><span class="pln">
</span><span class="lit" style="color: #006666;">@Test</span><span class="pln">
</span><span class="kwd" style="color: #000088;">public</span><span class="pln"> </span><span class="kwd" style="color: #000088;">void</span><span class="pln"> testMaximumSalary</span><span class="pun" style="color: #666600;">()</span><span class="pln"> </span><span class="pun" style="color: #666600;">{</span><span class="pln">
</span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pln"> annualSalary </span><span class="pun" style="color: #666600;">=</span><span class="pln"> </span><span class="kwd" style="color: #000088;">new</span><span class="pln"> </span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pun" style="color: #666600;">(</span><span class="lit" style="color: #006666;">80000</span><span class="pun" style="color: #666600;">);</span><span class="pln">
</span><span class="kwd" style="color: #000088;">when</span><span class="pun" style="color: #666600;">(</span><span class="pln">employeeDAO</span><span class="pun" style="color: #666600;">.</span><span class="pln">getAnnualSalary</span><span class="pun" style="color: #666600;">(</span><span class="typ" style="color: #660066;">UserId</span><span class="pun" style="color: #666600;">)).</span><span class="pln">thenReturn</span><span class="pun" style="color: #666600;">(</span><span class="pln">annualSalary</span><span class="pun" style="color: #666600;">);</span><span class="pln">
</span><span class="kwd" style="color: #000088;">when</span><span class="pun" style="color: #666600;">(</span><span class="pln">taxCalculator</span><span class="pun" style="color: #666600;">.</span><span class="pln">calculateTaxes</span><span class="pun" style="color: #666600;">(</span><span class="pln">annualSalary</span><span class="pun" style="color: #666600;">)).</span><span class="pln">thenReturn</span><span class="pun" style="color: #666600;">(</span><span class="kwd" style="color: #000088;">new</span><span class="pln"> </span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pun" style="color: #666600;">(</span><span class="lit" style="color: #006666;">8000</span><span class="pun" style="color: #666600;">));</span><span class="pln">
</span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pln"> actual </span><span class="pun" style="color: #666600;">=</span><span class="pln"> salaryService</span><span class="pun" style="color: #666600;">.</span><span class="pln">getNetSalary</span><span class="pun" style="color: #666600;">(</span><span class="typ" style="color: #660066;">UserId</span><span class="pun" style="color: #666600;">);</span><span class="pln">
assertThat</span><span class="pun" style="color: #666600;">(</span><span class="pln">actual</span><span class="pun" style="color: #666600;">.</span><span class="pln">compareTo</span><span class="pun" style="color: #666600;">(</span><span class="kwd" style="color: #000088;">new</span><span class="pln"> </span><span class="typ" style="color: #660066;">BigDecimal</span><span class="pun" style="color: #666600;">(</span><span class="lit" style="color: #006666;">72000</span><span class="pun" style="color: #666600;">)),</span><span class="pln"> </span><span class="kwd" style="color: #000088;">is</span><span class="pun" style="color: #666600;">(</span><span class="lit" style="color: #006666;">0</span><span class="pun" style="color: #666600;">));</span><span class="pln">
</span><span class="pun" style="color: #666600;">}</span><span class="pln">
</span><span class="pun" style="color: #666600;">}</span></pre>
<br />
It is simple and efficient and hopefully it will be useful for someone else out there.Unknownnoreply@blogger.com0