Alternate JVM Languages

50
Abhijeet Lele Vladimir Zakharov 21/04/2011 Goldman Sachs

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

Page 1: Alternate JVM Languages

Abhijeet Lele Vladimir Zakharov

21/04/2011

Goldman Sachs

Page 2: Alternate JVM Languages

GoalsGoals

2

Our Guarantee:You won’t become knowledgeable,

but you will become aware

Page 3: Alternate JVM Languages

JavaJava

3

Page 4: Alternate JVM Languages

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

Page 5: Alternate JVM Languages

Anagram Algorithm: How It WorksAnagram Algorithm: How It Works

5

Page 6: Alternate JVM Languages

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

Page 7: Alternate JVM Languages

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

Page 8: Alternate JVM Languages

GroovyGroovy

8

Page 9: Alternate JVM Languages

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

Page 10: Alternate JVM Languages

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

Page 11: Alternate JVM Languages

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

Page 12: Alternate JVM Languages

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

Page 13: Alternate JVM Languages

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

Page 14: Alternate JVM Languages

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" }

Page 15: Alternate JVM Languages

ScalaScala

15

Page 16: Alternate JVM Languages

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

Page 17: Alternate JVM Languages

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

Page 18: Alternate JVM Languages

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

Page 19: Alternate JVM Languages

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

Page 20: Alternate JVM Languages

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

Page 21: Alternate JVM Languages

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

Page 22: Alternate JVM Languages

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))

Page 23: Alternate JVM Languages

JythonJython

23

Page 24: Alternate JVM Languages

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

Page 25: Alternate JVM Languages

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

Page 26: Alternate JVM Languages

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

Page 27: Alternate JVM Languages

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>}

э

Page 28: Alternate JVM Languages

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();

}

});

Page 29: Alternate JVM Languages

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)

Page 30: Alternate JVM Languages

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

Page 31: Alternate JVM Languages

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)

Page 32: Alternate JVM Languages

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!

Page 33: Alternate JVM Languages

ClojureClojure

33

Page 34: Alternate JVM Languages

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

Page 35: Alternate JVM Languages

(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

Page 36: Alternate JVM Languages

(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

Page 37: Alternate JVM Languages

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)))))

Page 38: Alternate JVM Languages

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))

Page 39: Alternate JVM Languages

(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!

Page 40: Alternate JVM Languages

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))

Page 41: Alternate JVM Languages

JRubyJRuby

41

Page 42: Alternate JVM Languages

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

Page 43: Alternate JVM Languages

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

Page 44: Alternate JVM Languages

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

Page 45: Alternate JVM Languages

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

Page 46: Alternate JVM Languages

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

Page 47: Alternate JVM Languages

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

Page 48: Alternate JVM Languages

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

Page 49: Alternate JVM Languages

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

Page 50: Alternate JVM Languages

The EndThe End

50