Skip to main content

Power of declarative syntax of Lambda

Since Java has introduced lambda, writing code has become a breeze especially when it comes to expressing what you want to computer to do rather than how to do it. The following is a question from Project Euler and is solved using lambdas in Java8.

Let d(n) be defined as the sum of proper divisors of n (numbers less than n which
divide evenly into n). If d(a) = b and d(b) = a, where ab, then a and b are an
amicable pair and each of a and b are called amicable numbers.

For example, the proper divisors of 220 are 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 and
110; therefore d(220) = 284. The proper divisors of 284 are 1, 2, 4, 71 and 142;
so d(284) = 220.

Evaluate the sum of all the amicable numbers under 10000.
 A simple brute force solution is to check every number from 2 to 10000 and if its  an amicable number then add it to sum. Listing it in steps you are basically doing 3 things:
  1. Take numbers from 2 to 10000
  2. If number is amicable
  3. Add it
In Java 7 one will basically start a for loop, make another method for checking amicable property which in turn will have another method for getting divisors and its total. Adding to all this boilerplate there will be a lot of mutable variables like sum, temp just to track of the operations that you have listed. So much verbosity will easily divert somebody reading the code from actually knowing what the program is trying to achieve. One will have to dwell in the individual methods and track when the mutable variable is being accessed and what would be the outcome. Not saying that Java 7 leads to cluttered code, one can always write eye-pleasing code but at a cost of boilerplate classes and interfaces. In Java 8 it is natural for the code to be expressive, look at the Lambda solution for this question below:

It exactly matches the list of 3 things that we made to solve the problem. It iterates from 2 to 10000 and checks if the number is amicable and adds it, without the boilerplate. This style when applied to enterprise level applications makes them low maintenance and one can easily map the code to requirements.


Post a Comment

Popular posts from this blog

Guide : Spring Boot with Apache CXF for REST services

In this series of guide, we are going to explore writing REST services with Apache CXF using Spring Boot. The project is build using maven. I assume that you already know how to use maven. Step 1 : Adding dependencies for Spring Boot By default you have to inherit the parent pom of spring boot, but that cannot be followed everytime, so I use an alternative to that. I basically add spring boot pom as dependency so that it brings all the dependencies. <properties> <>UTF-8</> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring.version>1.4.3.RELEASE</spring.version> <cxf.version>3.1.10</cxf.version> </properties> <dependencies> <dependency> <!-- Alternative to inheriting from parent spring pom --> <groupId>org.springframework.boot</groupI…

Enabling CXF goodies in Spring Boot

In this post we are going to add some of the CXF features to our existing app that we developed in previous post. These features are : ID LoggingJackson Provider for POJO to JSON conversionSwagger 2 documentationStep 1: Configuration class Create a RestServer class in config package as shown below
package;importcom.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;importorg.apache.cxf.feature.LoggingFeature;importorg.apache.cxf.jaxrs.swagger.Swagger2Feature;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;/** * Created by Anand_Rajneesh on 3/23/2017. */@ConfigurationpublicclassRestServer{@Beanpublic JacksonJsonProvider jsonProvider(){returnnewJacksonJsonProvider();}@Beanpublic LoggingFeature loggingFeature(){returnnewLoggingFeature();}@Beanpublic Swagger2Feature swagger(){ Swagger2Feature swagger =new Swagger2Feature(); swagger.setBasePath("/services"); swagger.setContact("…

PL SQL Cheatsheet

PL/SQL Syntax for reference

Basic PL/SQL block
DECLARE --variable declarations go here BEGIN --program logic goes here END;
Functions - Named pl/sql blocks mainly used for computation and not for write operations. They return value to the caller as defined in function.
Procedure - Named pl/sql block used for write operations.
CREATE OR REPLACE PROCEDURE myProc( arg1_in IN VARCHAR2, arg2_in IN VARCHAR2) AS arg3 VARCHAR2(2048); arg4 BOOLEAN; BEGIN --logic END;
Variable Declarations 
arg VARCHAR2(2048) := 'myString'; arg BOOLEAN := true; arg NUMBER := 10;
IF ELSE Conditions
IF (condition) THEN --logic 1 ELSIF (condition2) THEN --logic 2 ELSE --logic3 END IF;
SWITCH Statements
With selector
arg1 NUMBER := 0; CASE arg1 WHEN 0 THEN --logic; WHEN 1 THEN --…