alternate jvm languages
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
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
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