Saturday, February 4, 2012

Java 8 Lambda a terrible troll and Java is lame duck

            Nothing more to scare about the title, and more, this is not a post to slam or defamatory content against java. The Recent announcement about java 8 to support lambda and introduce functional programming abilities to java made me to wonder, really do we need this? Once my friend Mr.Balan said its Steve Jobs ,not apple and apple would had not been great without steve jobs. Its all about people who make things great rather than believing group or companies.

            Thanks to Mr. Cedric Beust whom  I respect a lot, his outstanding creation TestNG. The title of this post is the tweet he mentioned on me noting 'Terrible troll' when I asked 'Why google endorses java and why not something better than it'. Google employee tweeted saying that 'Google would had invented java if not exist'. More, google employees does not show overwhelming response to new JVM/CLR languages like scala and clojure. However Cedric can write some disappointing post like coding in high level type system languages would eclipse if not using eclipse from  scala back to java. This post made my adrenaline going. In fact prestigious, proud ruby developers use vim, yes honest authentic passionate ruby developers use vim, while some use textmate for ruby coding.

            Then I looked back at my poor java announcement that any chance for atleast java 8 to swing the theories of Functional programming. But in vain, where my respected oracle developers traveled with camels to thar desert, sat under khejri tree, intensively thought about building expensive lambda islands in par to what Dubai tries to. Unfortunately they failed like creating Indian Mumbai building constructions with poor quality material. In 2002 C# finished chapter, Scala moreover finished in providing lambda in 2005. Then, what is the point in creating a huge buzz about lambda in java 8 by the year 2012, then saying 'Java will adopt C# syntax'? This should have been wisely copied or taken 8 years back.

            Java already screwed with some concepts like anonymous inner classes. Though I am not object oriented or based specialist, but really I could not connect with reality about class nesting inside a class. Can a person nest a  person inside? If so what is the use of that.

            Actually speaking, this is what happens with sorting a collection, where comparable interface is implemented and collection.sort in turn calls the comparaTo method for status, to swap the element positions. But where is the thrill?

            Java 8 lambda is a lame duck. Because there are no first class functions. Functions are not senior citizens. Otherwords, its more or less same way of achieving to sort a collection by implementing comparable interface. Whereas in scala, functions are senior citizens. Let me get straight to examples.

Open scala prompt, to find a minimum element in an list,

val values = List(1, 2, 3, 4, 5)
println(values.foldLeft(0) { (acc_res: Int, index: Int) => if(index < acc_res) index else acc_res }) 
//prints 0 //To find maximum, (just change the comparison symbol :)) def maxi(acc_res: Int, index: Int) = { if(index > acc_res) index else acc_res } println(values.foldLeft(0) { maxi }) //prints 5


What the same to do in Java, to find the minimum element, comparable interface must be implemented or custom interface is created in favorite naming in favorite eclipse, that hangs windows xp for 5 mins, a method declared in interface, and then defined to return status in implementation class. Finally call made to implementation class that implements of type 'comparable' sort of interface(or custom interface)

Now coming to Java 8 Lambda, serious comedy fuels, just look at the sample lambda program

public class SimpleLambda {
  interface HelloWorld {
    void greet();
  }

  {
    HelloWorld greeting = () -> System.out.println("Hello World!");
    greeting.greet();
  }

  public static void main(String... args) {
    new SimpleLambda();
  }


}


Type of anonymous functions or lambda? Its the same as interface.
Hence interface should be defined prior to assigning a anonymous function which is not the intent of lambda in other languages.

To add, a question already in heavy discussion on quora for oracle to declare explicit support to scala instead of spreading fad.

Since Java ones are tamarind to declarative programming, scala itself more sufficient.

Microsoft .NET can better declare explicit support for clojure, as I believe C++ and C# programmers be intuitive and pick up clojure on CLR.

James gosling intent of java is just to please the average coders, I am not one and you too.,,

Enjoy functional programming, DSL and kudos to Scala and Clojure.

1 comment:

Pierre-Yves Saumont said...

List list = Arrays.asList(1, 2, 3, 4, 5);

list.stream().reduce((x, y) -> y < y ? y : x).ifPresent(System.out::println);