Download - Alternate JVM Languages
![Page 1: Alternate JVM Languages](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/1.jpg)
Abhijeet Lele Vladimir Zakharov
21/04/2011
Goldman Sachs
![Page 2: Alternate JVM Languages](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/2.jpg)
GoalsGoals
2
Our Guarantee:You won’t become knowledgeable,
but you will become aware
![Page 3: Alternate JVM Languages](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/3.jpg)
JavaJava
3
![Page 4: Alternate JVM Languages](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/4.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/5.jpg)
Anagram Algorithm: How It WorksAnagram Algorithm: How It Works
5
![Page 6: Alternate JVM Languages](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/6.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/7.jpg)
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
![Page 8: Alternate JVM Languages](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/8.jpg)
GroovyGroovy
8
![Page 9: Alternate JVM Languages](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/9.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/10.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/11.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/12.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/13.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/14.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/15.jpg)
ScalaScala
15
![Page 16: Alternate JVM Languages](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/16.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/17.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/18.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/19.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/20.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/21.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/22.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/23.jpg)
JythonJython
23
![Page 24: Alternate JVM Languages](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/24.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/25.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/26.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/27.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/28.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/29.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/30.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/31.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/32.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/33.jpg)
ClojureClojure
33
![Page 34: Alternate JVM Languages](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/34.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/35.jpg)
(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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/36.jpg)
(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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/37.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/38.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/39.jpg)
(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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/40.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/41.jpg)
JRubyJRuby
41
![Page 42: Alternate JVM Languages](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/42.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/43.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/44.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/45.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/46.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/47.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/48.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/49.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022050905/54b7739e4a7959df648b45bb/html5/thumbnails/50.jpg)
The EndThe End
50