Alternate JVM Languages

Post on 15-Jan-2015

1.516 views 3 download

Tags:

description

This session will take you on a tour of several languages that on the surface only share one thing in common – they all run on JVM as the execution platform. However, despite completely different appearances of Scala, Clojure, Jython and Groovy, we will demonstrate that they have some important commonalities. You will also see the emerging importance of JVM as a generic platform (as opposed to focusing on Java the language). During the session we will implement a solution to a simple problem in each language, then compare these languages to Java. These solutions, while simple, will nonetheless highlight some of the common principles and implementation patterns that exist across the languages based on different paradigms. The solutions will also show how these approaches are different from implementation patterns common in Java.

Transcript of Alternate JVM Languages

Abhijeet Lele Vladimir Zakharov

21/04/2011

Goldman Sachs

GoalsGoals

2

Our Guarantee:You won’t become knowledgeable,

but you will become aware

JavaJava

3

Interview With Josh BlochInterview With Josh Bloch

Can you give us an example of code that you are most proud of creating and explain why?

The Collections framework. It's far from perfect, but it's proven itself maintainable and pleasant over the years. Doug Lea built many parts of java.util.concurrent atop it. And I still get letters from programmers telling me how much more pleasant it makes their jobs. It lets you write stuff like this little program, which computes all the anagrams in the file on standard input.

From “2008 JavaOne Conference - Rock Star Joshua Bloch”http://java.sun.com/javaone/sf/2008/articles/rockstar_joshuabloch.jsp

4

Anagram Algorithm: How It WorksAnagram Algorithm: How It Works

5

Java ExampleJava Exampleimport java.util.*;public class Anagram { public static void main(String[] args){ int minGroupSize = Integer.parseInt(args[0]);// Read words from input and put into simulated multimap

Map<String, List<String>> anagrams = new HashMap<String, List<String>>(); for (Scanner s = new Scanner(System.in); s.hasNext();) {String word = s.next();String alphagram = alphagram(word);List<String> group = anagrams.get(alphagram);if (group == null)anagrams.put(alphagram, group = new ArrayList<String>());

group.add(word);}// Print all permutation groups above size threshold

for (List<String> group : anagrams.values())if (group.size() >= minGroupSize)System.out.println(group.size() + ": " + group);

}private static String alphagram(String s){ char[] chars = s.toCharArray();Arrays.sort(chars);return String.valueOf(chars);

}}

6

From “2008 JavaOne Conference - Rock Star Joshua Bloch”

http://java.sun.com/javaone/sf/2008/articles/rockstar_joshuabloch.jsp

Java Example With Deluxe FeaturesJava Example With Deluxe Featuresimport java.util.*;public class Anagram {public static void main(String[] args) {int minGroupSize = Integer.parseInt(args[0]);Map<String, List<String>> anagrams = new HashMap<String, List<String>>(); for (Scanner s = new Scanner(System.in); s.hasNext();) {String word = s.next();String alphagram = alphagram(word);List<String> group = anagrams.get(alphagram);if (group == null)anagrams.put(alphagram, group = new ArrayList<String>());

group.add(word); }List<List<String>> winners = new ArrayList<List<String>>();for (List<String> group : anagrams.values())if (group.size() >= minGroupSize)winners.add(group);

Collections.sort(winners, new Comparator<List<String>>() {public int compare(List<String> o1, List<String> o2) {return o2.size()-o1.size();

}});for (List<String> winner: winners)System.out.println(winner.size() + ": " + winner);

}

private static String alphagram(String s) {char[] chars = s.toCharArray();Arrays.sort(chars);return String.valueOf(chars);

}}

7

Additional code from “The Java™ Tutorial > Collections”

http://download.oracle.com/javase/tutorial/collections/algorithms/index.html

Multimap

Filter

Sort

Print

Alphagram

GroovyGroovy

8

What is Groovy?What is Groovy?

• Definition– A lightweight, low-ceremony, dynamic, object-oriented language– Open sourced under Apache License, version 2.0– “marvelous, wonderful, excellent, hip, trendy.” (Merriam-

Webster)

• Like Java– Follows Java semantics– Seamlessly integrates with Java– Compiles into Java bytecode – Extends the Java API and libraries – Groovy scripts can be injected into Java

• Not like Java– Dynamic Language– Closures– Properties– Native syntax for lists, maps, and regular expressions

9

String.metaClass.alphagram = {

char[] chars = delegate.toCharArray()

Arrays.sort(chars)

return String.valueOf(chars)

}

private static String alphagram(String s) {

char[] chars = s.toCharArray();

Arrays.sort(chars);

return String.valueOf(chars);

}

10

Groovy: AlphagramGroovy: Alphagram

JavaJava

GroovyGroovy

String.metaClass.alphagram = { return delegate.toList().sort().join()

}

Groovy Groovy -- erer

anagrams = (new Scanner(System.in)).toList().groupBy {it.alphagram()}

Map<String, List<String>> anagrams = new HashMap<String, List<String>>();

for (Scanner s = new Scanner(System.in); s.hasNext();) {

String word = s.next();

String alphagram = alphagram(word);

List<String> group = anagrams.get(alphagram);

if (group == null)

anagrams.put(alphagram, group = new ArrayList<String>());

group.add(word);

}

11

Groovy: Building MultimapGroovy: Building Multimap

JavaJava

GroovyGroovy

winners = anagrams.values().findAll { it.size > minWordCount }

winners = winners.sort { -it.size }

winners.each { println "${it.size} : $it" }

List<List<String>> winners = new ArrayList<List<String>>();

for (List<String> group : anagrams.values())

if (group.size() >= minGroupSize)

winners.add(group);

Collections.sort(winners, new Comparator<List<String>>() {

public int compare(List<String> o1, List<String> o2) {

return o2.size()-o1.size();

}

});

for (List<String> winner: winners)

System.out.println(winner.size() + ": " + winner);

12

Groovy: Filtering, Sorting, PrintingGroovy: Filtering, Sorting, Printing

JavaJava

GroovyGroovy

Groovy: Putting It All TogetherGroovy: Putting It All Together

String.metaClass.alphagram = { return delegate.toList().sort().join()

}

minWordCount = args[0].toInteger();

(new Scanner(System.in)).toList()

.groupBy { it.alphagram() }

.values()

.findAll { it.size > minWordCount }

.sort { -it.size }

.each { println "${it.size} : $it" }

13

Java ReminderJava Reminderimport java.util.*;public class Anagram {public static void main(String[] args) {int minGroupSize = Integer.parseInt(args[0]);Map<String, List<String>> anagrams = new HashMap<String, List<String>>(); for (Scanner s = new Scanner(System.in); s.hasNext();) {String word = s.next();String alphagram = alphagram(word);List<String> group = anagrams.get(alphagram);if (group == null)anagrams.put(alphagram, group = new ArrayList<String>());

group.add(word); }List<List<String>> winners = new ArrayList<List<String>>();for (List<String> group : anagrams.values())if (group.size() >= minGroupSize)winners.add(group);

Collections.sort(winners, new Comparator<List<String>>() {public int compare(List<String> o1, List<String> o2) {return o2.size()-o1.size();

}});for (List<String> winner: winners)System.out.println(winner.size() + ": " + winner);

}

private static String alphagram(String s) {char[] chars = s.toCharArray();Arrays.sort(chars);return String.valueOf(chars);

}}

14

String.metaClass.alphagram = { return delegate.toList().sort().join()

}

minWordCount = args[0].toInteger();

(new Scanner(System.in)).toList().groupBy { it.alphagram() } .values().findAll { it.size > minWordCount }.sort { -it.size }.each { println "${it.size} : $it" }

String.metaClass.alphagram = { return delegate.toList().sort().join()

}

minWordCount = args[0].toInteger();

(new Scanner(System.in)).toList().groupBy { it.alphagram() } .values().findAll { it.size > minWordCount }.sort { -it.size }.each { println "${it.size} : $it" }

ScalaScala

15

What is Scala?What is Scala?

• Like Java– Bytecode looks very similar to javac output– Familiar object-oriented concepts– Static types, only better (better type inference, better generics,

implicit parameters)– Performance equivalent to Java– Java code can depend on Scala code

• Not like Java– Functional principles– Closures– Everything is an object– No such thing as static – Greatly improved type inference and generics– Traits (mixins)– Pattern Matching

16

word => word.sorted

private static String alphagram(String s) {

char[] chars = s.toCharArray();

Arrays.sort(chars);

return String.valueOf(chars);

}

17

Scala: AlphagramScala: Alphagram

_.sorted

JavaJava

ScalaScala

Scala With UnderbarScala With Underbar

val map = new BufferedReader(new InputStreamReader(System.in)).readLine().split(" ").groupBy( _.sorted)

Map<String, List<String>> anagrams = new HashMap<String, List<String>>();

for (Scanner s = new Scanner(System.in); s.hasNext();) {

String word = s.next();

String alphagram = alphagram(word);

List<String> group = anagrams.get(alphagram);

if (group == null)

anagrams.put(alphagram, group = new ArrayList<String>());

group.add(word);

}

18

Scala: Building MultimapScala: Building Multimap

JavaJava

ScalaScala

val winners = map.values.filter(_.size > Integer.parseInt(args(0))).toListval sorted = winners.sortBy(-_.size)

List<List<String>> winners = new ArrayList<List<String>>();

for (List<String> group : anagrams.values())

if (group.size() >= minGroupSize)

winners.add(group);

Collections.sort(winners, new Comparator<List<String>>() {

public int compare(List<String> o1, List<String> o2) {

return o2.size()-o1.size();

}

});

19

Scala: Filtering And SortingScala: Filtering And Sorting

JavaJava

ScalaScala

for (winner <- sorted.view)

println(winner.size + ": " + winner)

for (List<String> winner: winners)

System.out.println(winner.size() + ": " + winner);

20

Scala: PrintingScala: Printing

sorted.view.map(list => list.size + ": " + list).foreach(println)

JavaJava

ScalaScala

Scala Scala –– Another WayAnother Way

Scala: Putting It TogetherScala: Putting It Together

new BufferedReader(new InputStreamReader(System.in))

.readLine()

.split(" ")

.groupBy(_.sorted)

.values

.filter(_.length > Integer.parseInt(args(0)))

.toList

.sortBy( - _.size )

.elements

.foreach(winner => println(winner.size + ": " + winner.toList))

21

Java ReminderJava Reminderimport java.util.*;public class Anagram {public static void main(String[] args) {int minGroupSize = Integer.parseInt(args[0]);Map<String, List<String>> anagrams = new HashMap<String, List<String>>(); for (Scanner s = new Scanner(System.in); s.hasNext();) {String word = s.next();String alphagram = alphagram(word);List<String> group = anagrams.get(alphagram);if (group == null)anagrams.put(alphagram, group = new ArrayList<String>());

group.add(word); }List<List<String>> winners = new ArrayList<List<String>>();for (List<String> group : anagrams.values())if (group.size() >= minGroupSize)winners.add(group);

Collections.sort(winners, new Comparator<List<String>>() {public int compare(List<String> o1, List<String> o2) {return o2.size()-o1.size();

}});for (List<String> winner: winners)System.out.println(winner.size() + ": " + winner);

}

private static String alphagram(String s) {char[] chars = s.toCharArray();Arrays.sort(chars);return String.valueOf(chars);

}}

22

new BufferedReader(new InputStreamReader(System.in)).readLine().split(" ").groupBy(_.sorted).values.filter(_.length > Integer.parseInt(args(0))).toList.sortBy( - _.size).elements.foreach(winner => println(winner.size+": "+ winner.toList))

new BufferedReader(new InputStreamReader(System.in)).readLine().split(" ").groupBy(_.sorted).values.filter(_.length > Integer.parseInt(args(0))).toList.sortBy( - _.size).elements.foreach(winner => println(winner.size+": "+ winner.toList))

JythonJython

23

What is Jython?What is Jython?

• Like Java– Have access to Java standard libraries and third party libraries

• Not like Java– Language is Python; latest release conforms to Python 2.5– Dynamically typed– Choice of using procedural, object oriented, or functional

programming constructs, or a mixture of the three– Have access to the Python standard libraries and any pure

Python third party library

• Not like Python– No access to compiled Python libraries– Some library features are not available (like fork) due to the

restrictions of the JVM

24

alpha = lambda l : ''.join(sorted(l))

private static String alphagram(String s) {

char[] chars = s.toCharArray();

Arrays.sort(chars);

return String.valueOf(chars);

}

25

Jython: AlphagramJython: Alphagram

JavaJava

JythonJython

Map<String, List<String>> anagrams = new HashMap<String, List<String>>();

for (Scanner s = new Scanner(System.in); s.hasNext();) {

String word = s.next();

String alphagram = alphagram(word);

List<String> group = anagrams.get(alphagram);

if (group == null)

anagrams.put(alphagram, group = new ArrayList<String>());

group.add(word);

}

anagrams = [list(g) for k, g in

itertools.groupby(

sorted(sys.stdin.readline().split(), key =alpha),

alpha)]

26

Jython: Building MultimapJython: Building Multimap

JavaJava

JythonJython

winners = (f for f in anagrams if len(f) > int(sys.argv[1]))

27

Jython: FilteringJython: Filtering

JavaJava

JythonJython

List<List<String>> winners = new ArrayList<List<String>>();

for (List<String> group : anagrams.values())

if (group.size() >= minGroupSize)

winners.add(group);

List comprehension:

<output> for <variables> in <collection> if <filter>

{<output>|<variables> <collection>, <filter>}

э

winners = sorted(winners, key = lambda t: -len(t))

28

Jython: SortingJython: Sorting

JavaJava

JythonJython

Collections.sort(winners, new Comparator<List<String>>() {

public int compare(List<String> o1, List<String> o2) {

return o2.size()-o1.size();

}

});

Jython: PrintingJython: Printing

29

for (List<String> winner: winners)

System.out.println(winner.size() + ": " + winner);

JavaJava

JythonJython

for winner in winners:

print '%i: %s '%(len(winner), winner)

Jython: Complete ExampleJython: Complete Example

import itertools

alpha = lambda l : ''.join(sorted(l))

winners = [

f for f in

sorted (

[list(g) for k, g in

itertools.groupby(

sorted(sys.stdin.readline().split(), key = alpha),

alpha)],

key = lambda t: -len(t) )

if(len(f) > int(sys.argv[1]))]

for winner in winners:

print '%i: %s '%(len(winner), winner)

30

Java ReminderJava Reminderimport java.util.*;public class Anagram {public static void main(String[] args) {int minGroupSize = Integer.parseInt(args[0]);Map<String, List<String>> anagrams = new HashMap<String, List<String>>(); for (Scanner s = new Scanner(System.in); s.hasNext();) {String word = s.next();String alphagram = alphagram(word);List<String> group = anagrams.get(alphagram);if (group == null)anagrams.put(alphagram, group = new ArrayList<String>());

group.add(word); }List<List<String>> winners = new ArrayList<List<String>>();for (List<String> group : anagrams.values())if (group.size() >= minGroupSize)winners.add(group);

Collections.sort(winners, new Comparator<List<String>>() {public int compare(List<String> o1, List<String> o2) {return o2.size()-o1.size();

}});for (List<String> winner: winners)System.out.println(winner.size() + ": " + winner);

}

private static String alphagram(String s) {char[] chars = s.toCharArray();Arrays.sort(chars);return String.valueOf(chars);

}}

31

import itertoolsalpha = lambda l : ''.join(sorted(l))

winners = [f for f in sorted ([list(g) for k, g initertools.groupby(sorted(sys.stdin.readline().split(), key=alpha),

alpha)], key = lambda t: -len(t) )

if(len(f) > int(sys.argv[1]))]

for winner in winners:print '%i: %s '%(len(winner), winner)

import itertoolsalpha = lambda l : ''.join(sorted(l))

winners = [f for f in sorted ([list(g) for k, g initertools.groupby(sorted(sys.stdin.readline().split(), key=alpha),

alpha)], key = lambda t: -len(t) )

if(len(f) > int(sys.argv[1]))]

for winner in winners:print '%i: %s '%(len(winner), winner)

Jython: A Jython: A ““SimpleSimple”” ExampleExampleimport java.util.*;public class Anagram {public static void main(String[] args) {int minGroupSize = Integer.parseInt(args[0]);Map<String, List<String>> anagrams = new HashMap<String, List<String>>(); for (Scanner s = new Scanner(System.in); s.hasNext();) {String word = s.next();String alphagram = alphagram(word);List<String> group = anagrams.get(alphagram);if (group == null)anagrams.put(alphagram, group = new ArrayList<String>());

group.add(word); }List<List<String>> winners = new ArrayList<List<String>>();for (List<String> group : anagrams.values())if (group.size() >= minGroupSize)winners.add(group);

Collections.sort(winners, new Comparator<List<String>>() {public int compare(List<String> o1, List<String> o2) {return o2.size()-o1.size();

}});for (List<String> winner: winners)System.out.println(winner.size() + ": " + winner);

}

private static String alphagram(String s) {char[] chars = s.toCharArray();Arrays.sort(chars);return String.valueOf(chars);

}}

32

def sort_string(buf):

l = list(buf)

l.sort()

return ''.join(l)

def get_words():

fp = open('dictionary', 'r')

words = [ l.strip() for l in fp.readlines() ]

words.sort()

return words

def get_lists_of_size(list_lists, min_size):

return [ l for l in list_lists if len(l) >= min_size ]

def main():

all_anagrams = {}

for word in get_words():

key = sort_string(word)

if all_anagrams.has_key(key):

all_anagrams[key].append(word)

else:

all_anagrams[key] = [word]

list_lists = all_anagrams.values()

winners = get_lists_of_size(anagrams, 8)

winners.sort(cmp=lambda x,y: cmp(-len(x), -len(y)))

for winner in winners:

print "%d : %s" % (len(winner), winner)

You can w

rite Ja

va

in a

ny language!

ClojureClojure

33

What is Clojure?What is Clojure?

• Like Java– Not much, really– Data structures implement the read-only portion of Collection– Functions implement Runnable & Callable

• Not like Java– Dynamic, functional language– Not object-oriented (!)– Persistent, immutable data structures– Lazy sequence abstraction– Software transactional memory– Multimethods and ad-hoc hierarchies– Macros

• Compared to Common Lisp/Scheme– Persistent, immutable data structures– First-class Vectors, Sets, and Maps– Focus on concurrency– No tail call optimization; explicit calls to recur and trampoline required

34

(defn alphagram [word] (apply str (sort word)))

private static String alphagram(String s) {

char[] chars = s.toCharArray();

Arrays.sort(chars);

return String.valueOf(chars);

}

35

Clojure: AlphagramClojure: Alphagram

#(apply str (sort %))

JavaJava

ClojureClojure

Clojure with placeholder syntaxClojure with placeholder syntax

(fn [word] (apply str (sort word)))

Clojure anonymous functionClojure anonymous function

(group-by alphagram (iterator-seq (java.util.Scanner. System/in)))

Map<String, List<String>> anagrams = new HashMap<String, List<String>>();

for (Scanner s = new Scanner(System.in); s.hasNext();) {

String word = s.next();

String alphagram = alphagram(word);

List<String> group = anagrams.get(alphagram);

if (group == null)

anagrams.put(alphagram, group = new ArrayList<String>());

group.add(word);

}

36

Clojure: MultimapClojure: Multimap

(group-by #(apply str (sort %))

(iterator-seq (java.util.Scanner. System/in)))

JavaJava

ClojureClojure

Clojure with placeholder syntaxClojure with placeholder syntax

List<List<String>> winners = new ArrayList<List<String>>();

for (List<String> group : anagrams.values())

if (group.size() >= minGroupSize)

winners.add(group);

Collections.sort(winners, new Comparator<List<String>>() {

public int compare(List<String> o1, List<String> o2) {

return o2.size()-o1.size();

}

});

37

Clojure: Filtering And SortingClojure: Filtering And Sorting

JavaJava

ClojureClojure

(def words-in (iterator-seq (java.util.Scanner. System/in)))

(defn select-anagrams [words]

(sort-by #(- (count %))

(filter #(> (count %) min-group-size)

(vals

(group-by alphagram words)))))

for (List<String> winner: winners)

System.out.println(winner.size() + ": " + winner);

}

38

Clojure: PrintingClojure: Printing

JavaJava

ClojureClojure

(doseq [winner (select-anagrams words-in)]

(println (count winner) ": " winner))

(let [alphagram #(apply str (sort %))

map (group-by alphagram words-in)

filtered (filter #(> (count %) min-group-size) (vals map))

winners (sort-by #(- (count %)) filtered)]

(doseq [winner winners] (println (count winner) ": " winner)))

(defn alphagram [word] (apply str (sort word)))

(def min-group-size (Integer/valueOf (first *command-line-args*)))

(def words-in (iterator-seq (java.util.Scanner. System/in)))

(defn select-anagrams [words]

(sort-by #(- (count %))

(filter #(> (count %) min-group-size)

(vals

(group-by alphagram words)))))

(doseq [winner (select-anagrams words-in)]

(println (count winner) ":" winner))

39

Clojure: Complete ExampleClojure: Complete Example

Keeping it functionalKeeping it functional

Let there be bindings!Let there be bindings!

Java ReminderJava Reminderimport java.util.*;public class Anagram {public static void main(String[] args) {int minGroupSize = Integer.parseInt(args[0]);Map<String, List<String>> anagrams = new HashMap<String, List<String>>(); for (Scanner s = new Scanner(System.in); s.hasNext();) {String word = s.next();String alphagram = alphagram(word);List<String> group = anagrams.get(alphagram);if (group == null)anagrams.put(alphagram, group = new ArrayList<String>());

group.add(word); }List<List<String>> winners = new ArrayList<List<String>>();for (List<String> group : anagrams.values())if (group.size() >= minGroupSize)winners.add(group);

Collections.sort(winners, new Comparator<List<String>>() {public int compare(List<String> o1, List<String> o2) {return o2.size()-o1.size();

}});for (List<String> winner: winners)System.out.println(winner.size() + ": " + winner);

}

private static String alphagram(String s) {char[] chars = s.toCharArray();Arrays.sort(chars);return String.valueOf(chars);

}}

40

(defn alphagram [word] (apply str (sort word)))(def min-group-size (Integer/valueOf (first *command-line-args*)))

(def words-in(iterator-seq (java.util.Scanner. System/in)))

(defn select-anagrams [words] (sort-by #(- (count %)) (filter #(> (count %) min-group-size) (vals(group-by alphagram words)))))

(doseq [winner (select-anagrams words-in)](println (count winner) ":" winner))

(defn alphagram [word] (apply str (sort word)))(def min-group-size (Integer/valueOf (first *command-line-args*)))

(def words-in(iterator-seq (java.util.Scanner. System/in)))

(defn select-anagrams [words] (sort-by #(- (count %)) (filter #(> (count %) min-group-size) (vals(group-by alphagram words)))))

(doseq [winner (select-anagrams words-in)](println (count winner) ":" winner))

JRubyJRuby

41

What is JRuby?What is JRuby?

• Like Java– Have access to Java standard libraries and third party

libraries– Runs in a JVM

• Not like Java– Language is Ruby; latest release conforms to Ruby 1.8.7– Dynamically typed– Can compile to class files– Have access to the Ruby standard libraries and any pure

Ruby third party library

• Not like Ruby– No access to Ruby native-C API– No access to Ruby continuations

42

word.chars.sort.join

private static String alphagram(String s) {

char[] chars = s.toCharArray();

Arrays.sort(chars);

return String.valueOf(chars);

}

43

JRuby Example: AlphagramJRuby Example: Alphagram

JavaJava

JRubyJRuby

anagrams = words.group_by { |word| word.chars.sort.join }

Map<String, List<String>> anagrams = new HashMap<String, List<String>>();

for (Scanner s = new Scanner(System.in); s.hasNext();) {

String word = s.next();

String alphagram = alphagram(word);

List<String> group = anagrams.get(alphagram);

if (group == null)

anagrams.put(alphagram, group = new ArrayList<String>());

group.add(word);

}

44

JRuby: MultimapJRuby: Multimap

JavaJava

JRubyJRuby

filtered = anagrams.values.select {|array| array.length > 4 } winners = filtered.sort_by { |array| array.length }winners.each {|each| puts “#{each.size} : #{each.join(‘, ‘)}"}

List<List<String>> winners = new ArrayList<List<String>>();

for (List<String> group : anagrams.values())

if (group.size() >= minGroupSize)

winners.add(group);

Collections.sort(winners, new Comparator<List<String>>() {

public int compare(List<String> o1, List<String> o2) {

return o2.size()-o1.size();

}

});

for (List<String> winner: winners)

System.out.println(winner.size() + ": " + winner);

45

JRuby: Filtering, Sorting, PrintingJRuby: Filtering, Sorting, Printing

JavaJava

JRubyJRuby

JRuby: Complete ExampleJRuby: Complete Example

anagrams = words.group_by {|word| word.chars.sort.join}

filtered = anagrams.values.select {|array| array.length > 4}

winners = filtered.sort_by { |array| array.length }winners.each {|each| puts “#{each.size} : #{each.join(‘, ‘)}"}

46

JRuby: Complete Example JRuby: Complete Example –– LetLet’’s Make It Betters Make It Better

class String

def collation

self.chars.sort.join

end

end

class Symbol

def to_proc

proc { |*args| args[0].send(self, *args[1...args.size]) }

end

end

module Enumerable

def partitioned_with(&transformer)

group_by(&transformer).values

end

def longer_than(size)

self.select {|e| e.length > size}

end

def sorted_by_size

self.sort_by(&:length)

end

end

47

JRuby: Better Complete ExampleJRuby: Better Complete Example

groups = words.partitioned_with(&:collation)

winners = groups.longer_than(4).sorted_by_size

winners.each{|each| puts "#{each.size}: #{each.join(', ')}"}

48

TakeawaysTakeaways

• JVM provides a robust, industrial strength, scalable platform

• You can take advantage of JVM and the rest of the Java ecosystem without the complexity of Java the language

• Don’t have to wait for Java to adopt the features already available in other languages: closures, dynamic capabilities, rich, humane interfaces

• Not all languages are enterprise ready– These languages are still worth looking into

• Pragmatic Programmer advice: Learn a new language every year. When you learn a new language, you learn a new way to think.

49

The EndThe End

50