GoogleGuava       &EclipseModelingFramework2011/04/26   Mikaël Barbero
Introductionhttp://www.flickr.com/photos/drspam/295023450/                                                          1
About me‣ Modeling consultant‣ Research engineer‣ Trainer‣ Conference Speaker‣ Language guy ;)   ‣ Eclipse committer   ‣ G...
Paris        Nantes
Strategicmembers
AcceleoEMFCompareATLGMFOCLMylyn IntentEEF            LeadingSTP
Ava ilable technologies
Guava                                                   Overviewhttp://www.flickr.com/photos/slowburn/2986303105/          ...
http://www.flickr.com/photos/awagnon/1626025855/
About GuavaJava library used   Superset of  internally @        GoogleGoogle for years    Collections
About Guava   Apache License v2http://www.apache.org/licenses/LICENSE-2.0
About Guava                            s                                               s                       ti on      ...
Why using Guava?Simp lexity                       http://www.flickr.com/photos/gio_vencato/4941064345/
Why using Guava?         http://www.flickr.com/photos/reway2007/3300379295/
Why using Guava?Mainstream?                  http://www.flickr.com/photos/funtik/1175522045/
Why using Guava?Helpingothers                   http://www.flickr.com/photos/thearches/4381959041/
Inside GuavaIO                  Networking                  Concurrency     Primitive types               Collections     ...
Comparison with                      Apache Commons                         Better                                        ...
B est rep.
Corest of the                                                           corehttp://www.flickr.com/photos/27384147@N02/52117...
Objects classpublic class Person {	 final String name, nickname;	 final Movie favMovie;	   @Override	   public boolean equ...
Objects classpublic class Person {	 final String name, nickname;	 final Movie favMovie;  //...	  @Override	 public String ...
PreconditionsDefensive coding       if (state != State.PLAYABLE) {       	 throw new IllegalStateException(       	 	 "Can...
PreconditionsDefensive coding        public void setRating(StarRating rating) {        	 if (rating == null) {        	 	 ...
Equivalences strategiespublic interface Equivalence<T> {  boolean equivalent(@Nullable T a, @Nullable T b);  int hash(@Nul...
Suppliers                public interface Supplier<T> {                  T get();                }Supplier<String> s = ......
ThrowablesThrowables.getCausalChain(throwable);Throwables.getRootCause(throwable);Throwables.getStackTraceAsString(throwab...
@Annotation    @Beta        @VisibleForTesting@GwtCompatible   @GwtIncompatible
Stringshttp://www.flickr.com/photos/gernot/2554175292/                                                           4
CharMatcher                     +1        StringUtil example:        allAscii, collapse, collapseControlChars, collapseWhi...
Getting a CharMatcher      CharMatcher.WHITESPACE (Unicode)      CharMatcher.JAVA_DIGIT                               Pred...
Using your CharMatcher                     ‣ boolean matchesAllOf(CharSequence)                     ‣ boolean matchesAnyOf...
Using your CharMatcher                    String string = "Scream 4";                    CharMatcher matcher = CharMatcher...
Splitter                                +1      JDK has splitter                  ‣ regular expression                  ‣ ...
Splitter                                                                               e_s_jones/5060802981/              ...
Splitter              The default behavior is simplistic:              //yields [" foo", " ", "bar", " quux", ""]         ...
Ascii, CharsetsAscii  list of bytes constants for each  Char between 0x00 & 0x7FCharsets                                 b...
StringsString str = Strings.emptyToNull(s);String str = Strings.nullToEmpty(s);boolean b = Strings.isNullOrEmpty(s);
CaseFormat     ‣ LOWER_CAMEL      ‣ Java variable naming convention, e.g., "lowerCamel".     ‣ LOWER_HYPHEN      ‣ Hyphena...
Collectionshttp://www.flickr.com/photos/tochis/1169807846/                                                           5
Ordering                                               {                                Co mparator<T>              publ i...
Ordering                                                  public class Employee implements Comparable<Employee> {         ...
Ordering     Employee anakinSk = new Employee(4, "Anakin Skywalker", 4);     Employee darthVader = new Employee(3, "Darth ...
Ordering     Define your own Comparator   Comparator<Employee> yearsComparator = new Comparator<Employee>() {   	 @Override...
Ordering        Create an Ordering from a Comparator                               Ordering<Employee> orderUsingYearsCompa...
Ordering       toString() ordering            Ordering<Object> toStringOrdering = Ordering.usingToString();        Natural...
What you can do with Ordering‣ Ordering.min(Iterable<E>)‣ Ordering.max(Iterable<E>)‣ Ordering.leastOf(Iterable<E>, int)‣ O...
What you can do with Ordering‣ Ordering.sortedCopy(Iterable<E>)‣ Ordering.immutableSortedCopy(Iterable<E>)            new ...
Ordering is configurable         ‣ Ordering.reverse()         ‣ Ordering.lexicographical()         ‣ Ordering.nullsFirst() ...
ObjectArrays‣ concat(T, T[])‣ concat(T[], T)‣ concat(T[], T[], Class<T>)‣ newArray(Class<T>, int)‣ newArray(T[], int)
Multiset & MultimapHistorically, multisets (aka bags) and  multimaps emulated atop maps   Multimap = Map<K, List<V>>    Mu...
When to use Multiset?      ‣"I kinda want a Set except I can have duplicates"        ‣ card games example             ‣ ch...
Multiset    Ever done this?           Map<String, Integer> tags = new HashMap<String, Integer>();           for (BlogPost ...
Multiset  Would you rather do this?                              Multiset<String> tags = HashMultiset.create();           ...
Multiset API        ‣What if you need to remove/decrement?             ‣Dont accidentally go negative             ‣Dont fo...
Multiset API       ‣int count(Object element);       ‣int add(E element, int occurrences);       ‣boolean remove(Object el...
Multiset implementations                                  +1                                                     Immutable...
When to use Multimap?        Ever done this?              Map<Salesperson, List<Sale>> map = new HashMap<Salesperson,     ...
When to use Multimap?  Would you rather do this?   Multimap<Salesperson, Sale> multimap = ArrayListMultimap.create();   pu...
More about Multimap          A collection of key-value pairs (entries), like a Map,              except that keys dont hav...
Multimap subtypes       ‣ListMultimap: the get() view implements List        ‣preserves the ordering of entries per key;  ...
Multimap, before   Now we want to find the biggest Sale.   Without Multimap:public Sale getBiggestSale() {	 Sale biggestSal...
Multimap, afterpublic Sale getBiggestSale() {	 return Collections.max(multimap.values(), SALE_CHARGE_COMPARATOR);}        ...
Multimap API                   Most Map methods are identical on Multimap:                    ‣ size(),                   ...
Multimap implementations                                                +1                                                ...
BiMap       +1            aka unique-valued map             values are unique, as well as its keys            Has an inver...
BiMap Implementations                                                             ImmutableBiMap                          ...
Constrained Collections/Mapspublic interface Constraint<E> {	 E checkElement(E element);}                //...            ...
Constrained Collections/MapsConstraints.  constrainedCollection(Collection<E>, Constraint<? super E>)  constrainedList(Lis...
MapMaker                       +1A ConcurrentMap builder, providing any combination ofthese features:  ‣Soft or weak keys ...
MapMakerConcurrentMap<User, Graph> recommendations =	 	 	 new MapMaker()          .concurrencyLevel(4)	 	 	 	 .softKeys() ...
Forwarding Object/Collections Abstract implementations of existing types delegating all method calls to its delegate()    ...
Forwarding Collections  ForwardingCollection     ForwardingMultisetForwardingConcurrentMap     ForwardingObject    Forward...
Static utilitiesIn classes with name ending with an s                    ‣ Lists                    ‣ Maps                ...
Static factories methods                        +1Rather than typing     Map<String, Class<? extends Handler>> m =     	 n...
Maps as index                            +1Maps.uniqueIndex()     Map<Integer, Employee> m = Maps.uniqueIndex(values,     ...
Multimaps as index                              +1Multimaps.index()    Multimap<Integer, Employee> m = Multimaps.index(val...
Map differences                     +1        So you want to compute the differences                 between two maps   Gu...
MapDifference API          Map<K,V> entriesInCommon()          Map<K,V> entriesOnlyOnLeft()          Map<K,V> entriesOnlyO...
Sets union/intersection/difference                                                  +1difference(Set<E>, Set<?>)symmetricD...
Sets combinationsSet<Set<E>> powerSet(Set<E>)    while the power set of a set with size n is of size 2^n,               it...
Immutable collections     JDK has Collections.unmodifiableFoo wrappers          ‣Unmodifiable - you cant change it          ...
Immutable collections                             +1                                                              Immutabl...
Immutable collections       JDK wrappers still useful for unmodifiable views of       changing data. But for most purposes,...
Immutable collectionsFactory methods    ImmutableXXX.of() immutable empty XXX    ImmutableXXX.of(E) singletons    Immutabl...
Constants Sets                     public static final Set<Integer> LUCKY_NUMBERS;                     	 static {         ...
Constants Sets                    public static final Set<Integer> LUCKY_NUMBERS =                    Collections         ...
Constants Sets                public static final ImmutableSet<Integer> LUCKY_NUMBERS =                	 	 ImmutableSet.of...
Constants Maps     public static final Map<String, Integer> ENGLISH_TO_INT;     static {     	 Map<String, Integer> map = ...
Constants Maps                   public static final ImmutableMap<String, Integer>                   ENGLISH_TO_INT =     ...
Table                     @Beta                                                       since r07Collection with columns and...
http://www.flickr.com/photos/leamarzloff/3085027173/                                                      Functionnal      ...
in com.google.common.base package                                    public interface Predicate<T> { Predicate<T> to filter...
in com.google.common.collect package                                                                           Iterables.fi...
24           42           13           7           128public static void demo(Collection<Integer> c) {	 	 Predicate<Intege...
in com.google.common.collect package Iterables.transform() Iterators.transform()Collections2.transform()   Lists.transform...
Apple         Orange          Banana           Kiwi            Pearpublic void demo(Collection<String> c) {	 	 Function<St...
Bewareoflazyness   http://www.flickr.com/photos/torek/2467519466/
Copy!                                                         Lists.newArrayList()                                        ...
Compose and combine                      http://www.flickr.com/photos/jgscism/5484243543/Functions    compose    forPredica...
Compose and combine    Function<String, String> toUpper = new Function<String, String>() {    	 @Override    	 public Stri...
Compose and combine Predicate<String> isEmpty = new Predicate<String>() { 	 @Override 	 public boolean apply(String input)...
Maps transform & filterMaps.filterEntries()Maps.filterKeys()Maps.filterValues()Maps.transformEntries()Maps.transformValues()  ...
Primitives             7
common.primitives          package that helps you work with the primitive types                                           ...
common.primitives       Contains the classes        Booleans,                                                             ...
The big table         Method                   Longs              Ints          Shorts   Chars Doubles   Bytes   S.Bytes U...
http://www.flickr.com/photos/buzzingbye/222969493/                                                    IO & Network         ...
common.io                                                           2 key interfaces                                      ...
ByteStreams           ‣byte[] toByteArray(InputStream)           ‣byte[] toByteArray(InputSupplier)           ‣void readFu...
Files                                           The Files class works one level higher than                               ...
More about Files                    File createTempDir()                    void deleteDirectoryContents(File)            ...
Flushab les and Closeables      Flushables.flushQuietly(Flushable flushable)      Flushables.flush(        Flushable flush...
common.net                                                                                   ‣URI                         ...
Concurrencyhttp://www.flickr.com/photos/kh-67/3339157498/                                                          9
Concurrency in Guava                                                   Immutable*                                         ...
comm on.util.concurrent                     It’s all about Future (as in java.util.concurrent)                            ...
Future                                     JDK Future                 public interface Future<V> {                 	 	 //....
ListenableFuture                           Future with one new method: addListener                      When the future is...
ListenableFuture      When to use? Always.      (+) Most Futures methods require it.      (+) Its easier than changing to ...
Transform and chain                 Function<QueryResult, List<Row>> rowsFunction =                   new Function<QueryRe...
Transform and chain   Function<RowKey, ListenableFuture<QueryResult>> queryFunction =     new Function<RowKey, ListenableF...
Futures     Got a Iterable<Future<V>>?     Decide what you want:            Future of List<V>                             ...
Executors                     MoreExecutors.sameThreadExecutor                               for quick tasks that can run ...
Services                   "An object with an operational state, plus               asynchronous start() and stop() lifecy...
Services    AbstractExecutionThreadService              One thread automatically created for you at startup    AbstractIdl...
EMF for                                                  dummieshttp://www.flickr.com/photos/bendylan/259110679/           ...
Java Framework and code generation facility    "Class diagram to Super Java Bean"                  (My definition)
Ab out those modeling things‣It’s just about defining the entities/concepts/classesyou will manipulate‣You can define concep...
Ab out those modeling things‣Thin framework layer inserted into your POJO ‣you can even hide it ;)‣The layer is as thin as...
Ab out those modeling thingsWhat can you define in Ecore files?     ‣Package     ‣Classes     ‣Attributes     ‣References
Ab out those modeling things  ‣Packages    Logical organization  ‣Classes   Classical OO concepts  ‣Attributes   Primitive...
EObject?The thin layer that changes it all   Object eGet(EStructuralFeature feature);   void eSet(EStructuralFeature featu...
time to play                                                   883/                     /photos/8728229@N07/4592234http://...
EMFPathhttp://www.flickr.com/photos/eseartista/1604034788/                                                           11
Path
{                                 public interface Function<F, T>   Set of functions and          }                       ...
Lazy EObjects containment tree walking   ‣ parent     (eContainer)   ‣ ancestor   ‣ ancestorOrSelf   ‣ child   (eContents)...
Common predicates       Having       IsKind/IsType       IsAncestor/IsChild public     static   Collection<EObject> demoHa...
non-EMF functions & predicates            Stringslength : Function<String, Integer>toL1Case : Function<String, String>    ...
Ecore API has been Guava-ified‣ EObject.eResource() is wrapped as a Function inEObjectPath.eResource‣ EObject.eIsProxy() is...
Ecore has been Guava-ified through a generator             +    that is available for your own Ecore model
time to play                                                   883/                     /photos/8728229@N07/4592234http://...
Recaphttp://www.flickr.com/photos/loty/326761635/                                                      12
Wha t you should remember     about this presentation1.   Functionnal flavor of collection handling2.   CharMatcher / Split...
What you  should REALLY remember about this presentation1. Guava is cool, powerful and the definitiveextension to JDK!2. Ne...
http://www.flickr.com/photos/wwworks/4759535950/Q&A
Google Guava & EMF @ GTUG Nantes
Google Guava & EMF @ GTUG Nantes
Google Guava & EMF @ GTUG Nantes
Google Guava & EMF @ GTUG Nantes
Google Guava & EMF @ GTUG Nantes
Google Guava & EMF @ GTUG Nantes
Google Guava & EMF @ GTUG Nantes
Upcoming SlideShare
Loading in...5
×

Google Guava & EMF @ GTUG Nantes

6,444

Published on

Published in: Technology, News & Politics
0 Comments
19 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
6,444
On Slideshare
0
From Embeds
0
Number of Embeds
19
Actions
Shares
0
Downloads
183
Comments
0
Likes
19
Embeds 0
No embeds

No notes for slide

Google Guava & EMF @ GTUG Nantes

  1. 1. GoogleGuava &EclipseModelingFramework2011/04/26 Mikaël Barbero
  2. 2. Introductionhttp://www.flickr.com/photos/drspam/295023450/ 1
  3. 3. About me‣ Modeling consultant‣ Research engineer‣ Trainer‣ Conference Speaker‣ Language guy ;) ‣ Eclipse committer ‣ Guava-OSGi packager ‣ EMFPath lead
  4. 4. Paris Nantes
  5. 5. Strategicmembers
  6. 6. AcceleoEMFCompareATLGMFOCLMylyn IntentEEF LeadingSTP
  7. 7. Ava ilable technologies
  8. 8. Guava Overviewhttp://www.flickr.com/photos/slowburn/2986303105/ 2
  9. 9. http://www.flickr.com/photos/awagnon/1626025855/
  10. 10. About GuavaJava library used Superset of internally @ GoogleGoogle for years Collections
  11. 11. About Guava Apache License v2http://www.apache.org/licenses/LICENSE-2.0
  12. 12. About Guava s s ti on ti on c lle llec Co 5 Co a r03 a r08 gle v0. gle v1 uav uav G oo G oo G G2007 2008 2009 2010 2011 Frequent releases (quarterly base) Latest release (r09): April, 7th
  13. 13. Why using Guava?Simp lexity http://www.flickr.com/photos/gio_vencato/4941064345/
  14. 14. Why using Guava? http://www.flickr.com/photos/reway2007/3300379295/
  15. 15. Why using Guava?Mainstream? http://www.flickr.com/photos/funtik/1175522045/
  16. 16. Why using Guava?Helpingothers http://www.flickr.com/photos/thearches/4381959041/
  17. 17. Inside GuavaIO Networking Concurrency Primitive types Collections GWT compatibility is tested (see @GwtCompatible)
  18. 18. Comparison with Apache Commons Better BetterMore Modern Designed Supported Best practices Actively Java 5 developed and patterns (- commons 3.0)Respects JDK Google Orthogonality contracts (@Beta to test designs) depends on it (e.g., Google Guice) http://stackoverflow.com/questions/4542550/what-are-the-big-improvements-between-guava-and-apache-equivalent-libraries
  19. 19. B est rep.
  20. 20. Corest of the corehttp://www.flickr.com/photos/27384147@N02/5211738745/ 3
  21. 21. Objects classpublic class Person { final String name, nickname; final Movie favMovie; @Override public boolean equals(Object object) { if (object instanceof Person) { Person that = (Person) object; return Objects.equal(this.name, that.name) && Objects.equal(this.nickname, that.nickname) && Objects.equal(this.favMovie, that.favMovie); } return false; } @Override public int hashCode() { return Objects.hashCode(name, nickname, favMovie); }} Example from http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  22. 22. Objects classpublic class Person { final String name, nickname; final Movie favMovie; //... @Override public String toString() { return Objects.toStringHelper(this) .add("name", name) .add("nickname", nickname) .add("favMovie", favMovie) .toString(); } public String preferredName() { return Objects.firstNonNull(nickname, name); }} Example from http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  23. 23. PreconditionsDefensive coding if (state != State.PLAYABLE) { throw new IllegalStateException( "Cant play movie; state is " + state); } Preconditions.checkState(state == State.PLAYABLE, "Cant play movie; state is %s", state); Example from http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  24. 24. PreconditionsDefensive coding public void setRating(StarRating rating) { if (rating == null) { throw new NullPointerException(); } this.rating = rating; } public void setRating(StarRating rating) { this.rating = checkNotNull(rating); } Example from http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  25. 25. Equivalences strategiespublic interface Equivalence<T> { boolean equivalent(@Nullable T a, @Nullable T b); int hash(@Nullable T t);} Equivalence equals = Equivalences.equals(); Equivalence identity = Equivalences.identity(); Equivalence<String> elementEquivalence = ...; Equivalence<Iterable<String>> pairwise = Equivalences.pairwise(elementEquivalence); Collection<String> c1, c2; pairwise.equivalent(c1, c2);
  26. 26. Suppliers public interface Supplier<T> { T get(); }Supplier<String> s = ...; Supplier<String> memoizing = Suppliers.memoize(s); Supplier<String> expiring = Suppliers.memoizeWithExpiration(s, 100, TimeUnit.SECONDS); Supplier<String> ofInstance = Suppliers.ofInstance("Always returning");
  27. 27. ThrowablesThrowables.getCausalChain(throwable);Throwables.getRootCause(throwable);Throwables.getStackTraceAsString(throwable);Throwables.propagateIfInstanceOf(throwable, IOException.class);Throwables.propagateIfPossible(throwable);try { someMethodThatCouldThrowAnything();} catch (IKnowWhatToDoWithThisException e) { handle(e);} catch (Throwable t) { Throwables.propagateIfPossible(t); throw new RuntimeException("unexpected", t);}
  28. 28. @Annotation @Beta @VisibleForTesting@GwtCompatible @GwtIncompatible
  29. 29. Stringshttp://www.flickr.com/photos/gernot/2554175292/ 4
  30. 30. CharMatcher +1 StringUtil example: allAscii, collapse, collapseControlChars, collapseWhitespace, indexOfChars, lastIndexNotOf, numSharedChars, removeChars, removeCrLf, replaceChars, retainAllChars, strip, stripAndCollapse, stripNonDigits, ... Partial cross product of two notions: (a) whats a "matching" character? (b) what to do with those matching characters? CharMatcher: An instance of this type represents part (a), and the operation you invoke on it represents part (b).http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  31. 31. Getting a CharMatcher CharMatcher.WHITESPACE (Unicode) CharMatcher.JAVA_DIGIT Predefined constants CharMatcher.ASCII (examples) CharMatcher.ANY Factory methods CharMatcher.is(x) (examples) CharMatcher.isNot(_) CharMatcher.oneOf("aeiou").negate() CharMatcher.inRange(a, z).or(inRange(A, Z)) Subclass CharMatcher, implement matches(char c) Now check out all that you can do...http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  32. 32. Using your CharMatcher ‣ boolean matchesAllOf(CharSequence) ‣ boolean matchesAnyOf(CharSequence) ‣ boolean matchesNoneOf(CharSequence) ‣ int indexIn(CharSequence, int) ‣ int lastIndexIn(CharSequence, int) ‣ int countIn(CharSequence) ‣ String removeFrom(CharSequence) ‣ String retainFrom(CharSequence) ‣ String trimFrom(CharSequence) ‣ String trimLeadingFrom(CharSequence) ‣ String trimTrailingFrom(CharSequence) ‣ String collapseFrom(CharSequence, char) ‣ String trimAndCollapseFrom(CharSequence, char) ‣ String replaceFrom(CharSequence, char)http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  33. 33. Using your CharMatcher String string = "Scream 4"; CharMatcher matcher = CharMatcher.JAVA_LETTER_OR_DIGIT; int count = matcher.countIn(string); System.out.println("Letter or digit count: "+count); // Letter or digit count: 7 System.out.println(matcher.matchesAllOf("scream")); // true System.out.println(matcher.matchesAllOf("scream ")); // false System.out.println(matcher.matchesNoneOf("_?=)(")); // truehttp://scaramoche.blogspot.com/2010/05/googles-guava-library-tutorial-part-1.html
  34. 34. Splitter +1 JDK has splitter ‣ regular expression ‣ result as an array ‣ its way of handling empty pieces (which is very strange) Mini-puzzler ",a,,b,".split(",") returns... (a) "", "a", "", "b", "" (b) null, "a", null, "b", null (c) "a", null, "b" (d) "a", "b" (e) None of the abovehttp://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  35. 35. Splitter e_s_jones/5060802981/ http://www.flickr.com/photos/terenc Splitter is String.split() on steroidshttp://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  36. 36. Splitter The default behavior is simplistic: //yields [" foo", " ", "bar", " quux", ""] Splitter.on(,).split(" foo, ,bar, quux,"); If you want extra features, ask for them! //yields ["foo", "bar", "quux"] Splitter.on(,) .trimResults() .omitEmptyStrings() .split(" foo, ,bar, quux,");http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  37. 37. Ascii, CharsetsAscii list of bytes constants for each Char between 0x00 & 0x7FCharsets by G uaranteed to be supported ons al l Java platform implementati No more ‣Charsets.ISO_8859_1; try { bytes = string.getBytes("UTF-8"); ‣Charsets.US_ASCII; } catch (UnsupportedEncodingException e) { ‣Charsets.UTF_16; // how can this possibly happen? ‣Charsets.UTF_16BE; throw new AssertionError(e); } ‣Charsets.UTF_16LE; ‣Charsets.UTF_8;
  38. 38. StringsString str = Strings.emptyToNull(s);String str = Strings.nullToEmpty(s);boolean b = Strings.isNullOrEmpty(s);
  39. 39. CaseFormat ‣ LOWER_CAMEL ‣ Java variable naming convention, e.g., "lowerCamel". ‣ LOWER_HYPHEN ‣ Hyphenated variable naming convention, e.g., "lower-hyphen". ‣ LOWER_UNDERSCORE ‣ C++ variable naming convention, e.g., "lower_underscore". ‣ UPPER_CAMEL ‣ Java and C++ class naming convention, e.g., "UpperCamel". ‣ UPPER_UNDERSCORE ‣ Java and C++ constant naming convention, e.g., "UPPER_UNDERSCORE".E xample CaseFormat.to(CaseFormat.UPPER_UNDERSCORE, s);
  40. 40. Collectionshttp://www.flickr.com/photos/tochis/1169807846/ 5
  41. 41. Ordering { Co mparator<T> publ ic interface ); int compare(T, T abstract equals(Objec t); ean a bstract bool } Comparator is easy to implement, but a pain to use Push the Comparator<T> interface to the next levelhttp://scaramoche.blogspot.com/2010/05/googles-guava-library-tutorial-part-2.html
  42. 42. Ordering public class Employee implements Comparable<Employee> { private final int id; private final String name; private final int yearsOfService; public Employee(int id, String name, int yearsOfService) { this.id = id; this.name = name; this.yearsOfService = yearsOfService; } Simple public int getId() { return id; } public String getName() { return name; } data class public int getYearsOfService() { return yearsOfService; } @Override public int compareTo(Employee employee) { return this.getName().compareTo(employee.getName()); } @Override public String toString() { return Objects.toStringHelper(this) .add("id", id) .add("name", name) .add("years of service", yearsOfService) .toString(); } }http://scaramoche.blogspot.com/2010/05/googles-guava-library-tutorial-part-2.html
  43. 43. Ordering Employee anakinSk = new Employee(4, "Anakin Skywalker", 4); Employee darthVader = new Employee(3, "Darth Vader", 5); Employee hanSolo = new Employee(2, "Han Solo", 10); List <Employee> employeeList = Lists.newArrayList(anakinSk, hanSolo, darthVader); System.out.println("employee list: "+employeeList); employee list: [Employee{id=4, name=Anakin Skywalker, years of service=4}, Employee{id=2, name=Han Solo, years of service=10}, Employee {id=3, name=Darth Vader, years of service=5}]http://scaramoche.blogspot.com/2010/05/googles-guava-library-tutorial-part-2.html
  44. 44. Ordering Define your own Comparator Comparator<Employee> yearsComparator = new Comparator<Employee>() { @Override public int compare(Employee employee1, Employee employee2) { return (employee1.getYearsOfService() - employee2 .getYearsOfService()); } }; Comparator<Employee> idComparator = new Comparator<Employee>() { @Override public int compare(Employee employee1, Employee employee2) { return (employee1.getId() - employee2.getId()); } };http://scaramoche.blogspot.com/2010/05/googles-guava-library-tutorial-part-2.html
  45. 45. Ordering Create an Ordering from a Comparator Ordering<Employee> orderUsingYearsComparator = Ordering.from(yearsComparator); Use your ordering, e.g. to sort List<Employee> sortedCopy = orderUsingYearsComparator.sortedCopy(employeeList); System.out.println("sorted copy: " + sortedCopy); sorted copy: [Employee{id=4, name=Anakin Skywalker, years of service=4}, Employee{id=3, name=Darth Vader, years of service=5}, Employee{id=2, name=Han Solo, years of service=10}]http://scaramoche.blogspot.com/2010/05/googles-guava-library-tutorial-part-2.html
  46. 46. Ordering toString() ordering Ordering<Object> toStringOrdering = Ordering.usingToString(); Natural ordering (Comparable<T>) Ordering<Employee> natural = Ordering.natural();http://scaramoche.blogspot.com/2010/05/googles-guava-library-tutorial-part-2.html
  47. 47. What you can do with Ordering‣ Ordering.min(Iterable<E>)‣ Ordering.max(Iterable<E>)‣ Ordering.leastOf(Iterable<E>, int)‣ Ordering.greatestOf(Iterable<E>, int)‣ Ordering.isOrdered(Iterable<? extends T>)‣ Ordering.isStrictlyOrdered(Iterable<? extends T>)‣ Ordering.binarySearch(List<? extends T>, T)
  48. 48. What you can do with Ordering‣ Ordering.sortedCopy(Iterable<E>)‣ Ordering.immutableSortedCopy(Iterable<E>) new TreeSet( Collection)Better than card duplicate s elements Do not dis Performed sort is stable
  49. 49. Ordering is configurable ‣ Ordering.reverse() ‣ Ordering.lexicographical() ‣ Ordering.nullsFirst() ‣ Ordering.nullsLast() ‣ Ordering.reverse()Lexicographical returns anOrdering on Iterable of T [] < [1] < [1, 1] < [1, 2] < [2]
  50. 50. ObjectArrays‣ concat(T, T[])‣ concat(T[], T)‣ concat(T[], T[], Class<T>)‣ newArray(Class<T>, int)‣ newArray(T[], int)
  51. 51. Multiset & MultimapHistorically, multisets (aka bags) and multimaps emulated atop maps Multimap = Map<K, List<V>> Multiset = Map<K, Integer>
  52. 52. When to use Multiset? ‣"I kinda want a Set except I can have duplicates" ‣ card games example ‣ changing to List sacrifices contains() performance ‣"Are these Lists equal, ignoring order?" ‣ write a utility method for this? Histograms ‣"What distinct tags am I using on my blog, and how many times do I use each one?" Multiset performance varies by the number of distinct elements, not total size.http://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  53. 53. Multiset Ever done this? Map<String, Integer> tags = new HashMap<String, Integer>(); for (BlogPost post : getAllBlogPosts()) { for (String tag : post.getTags()) { int value = tags.containsKey(tag) ? tags.get(tag) : 0; tags.put(tag, value + 1); } } distinct tags: tags.keySet() count for "java" tag: Usage tags.containsKey("java") ? tags.get("java") : 0; total count: // oh crap...http://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  54. 54. Multiset Would you rather do this? Multiset<String> tags = HashMultiset.create(); for (BlogPost post : getAllBlogPosts()) { tags.addAll(post.getTags()); } distinct tags: tags.elementSet(); Usage count for "java" tag: tags.count("java"); (hurrah) total count: tags.size();http://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  55. 55. Multiset API ‣What if you need to remove/decrement? ‣Dont accidentally go negative ‣Dont forget to prune! ‣(Or just use a Multiset.) ‣What about concurrency? ‣Lock the entire map just to add one tag? ‣(Or just use our ConcurrentMultiset.) When you use a powerful library, your code can easily evolve.http://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  56. 56. Multiset API ‣int count(Object element); ‣int add(E element, int occurrences); ‣boolean remove(Object element, int occurrences); ‣int setCount(E element, int newCount); ‣boolean setCount(E e, int oldCount, int newCount);http://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  57. 57. Multiset implementations +1 ImmutableMultiset HashMultiset LinkedHashMultiset TreeMultiset EnumMultiset ConcurrentHashMultisethttp://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  58. 58. When to use Multimap? Ever done this? Map<Salesperson, List<Sale>> map = new HashMap<Salesperson, List<Sale>>(); public void makeSale(Salesperson salesPerson, Sale sale) { List<Sale> sales = map.get(salesPerson); if (sales == null) { sales = new ArrayList<Sale>(); map.put(salesPerson, sales); } sales.add(sale); }http://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  59. 59. When to use Multimap? Would you rather do this? Multimap<Salesperson, Sale> multimap = ArrayListMultimap.create(); public void makeSale(Salesperson salesPerson, Sale sale) { multimap.put(salesPerson, sale); } The code on the previous slide is ‣Verbose ‣Bug-prone ‣Limited in functionality ‣Using the wrong abstractionhttp://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  60. 60. More about Multimap A collection of key-value pairs (entries), like a Map, except that keys dont have to be unique. {a=1, a=2, b=3, c=4, c=5, c=6} multimap.get(key) returns a modifiable Collection view of the values associated with that key. Sometimes you want to think of it as a Map<K, Collection<V>> -- use the asMap() view: {a=[1, 2], b=[3], c=[4, 5, 6]}http://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  61. 61. Multimap subtypes ‣ListMultimap: the get() view implements List ‣preserves the ordering of entries per key; ‣can have duplicate entries ‣SetMultimap: the get() view implements Set ‣no duplicate entries, ‣ordering of entries is impl-dependent ‣SortedSetMultimap: the get() view implements SortedSet ‣you get the idea Hmm... sounds a lot like a plain old Map<K, Collection<V>>? But wait...http://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  62. 62. Multimap, before Now we want to find the biggest Sale. Without Multimap:public Sale getBiggestSale() { Sale biggestSale = null; for (List<Sale> sales : map.values()) { Sale myBiggestSale = Collections.max( sales, SALE_CHARGE_COMPARATOR); if (biggestSale == null || myBiggestSale.getCharge() > biggestSale().getCharge()) { biggestSale = myBiggestSale; } } return biggestSale;}http://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  63. 63. Multimap, afterpublic Sale getBiggestSale() { return Collections.max(multimap.values(), SALE_CHARGE_COMPARATOR);} View collections are very powerful. Multimap has six: ‣get(), ‣keys(), ‣keySet(), ‣values(), ‣entries(), ‣asMap().http://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  64. 64. Multimap API Most Map methods are identical on Multimap: ‣ size(), ‣ isEmpty(), ‣ containsKey(), ‣ containsValue(), ‣ put(), ‣ putAll(), ‣ clear(), ‣ values() The others have analogues: ‣ get() returns Collection<V> instead of V ‣ remove(K) becomes remove(K,V) and removeAll(K) ‣ keySet() becomes keys() (well, and keySet()) ‣ entrySet() becomes entries() And Multimap has a few new things: ‣ containsEntry(), ‣ replaceValues()http://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  65. 65. Multimap implementations +1 ImmutableMultimap ImmutableListMultimap ImmutableSetMultimap ArrayListMultimap HashMultimap LinkedHashMultimap LinkedListMultimap TreeMultimap ListMultimap SetMultimap SortedSetMultimaphttp://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  66. 66. BiMap +1 aka unique-valued map values are unique, as well as its keys Has an inverse() view, which is another BiMap bimap.inverse().inverse() == bimap Stop creating two separate forward and backward Maps!http://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  67. 67. BiMap Implementations ImmutableBiMap HashBiMap EnumBiMap EnumHashBiMaphttp://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  68. 68. Constrained Collections/Mapspublic interface Constraint<E> { E checkElement(E element);} //... public Object checkElement(Object element) { if (element == null) { throw new NullPointerException(); } return element; } Constraints.n otNull() //...
  69. 69. Constrained Collections/MapsConstraints. constrainedCollection(Collection<E>, Constraint<? super E>) constrainedList(List<E>, Constraint<? super E>) constrainedMultiset(Multiset<E>, Constraint<? super E>) constrainedSet(Set<E>, Constraint<? super E>) constrainedSortedSet(SortedSet<E>, Constraint<? super E>)
  70. 70. MapMaker +1A ConcurrentMap builder, providing any combination ofthese features: ‣Soft or weak keys ‣Soft or weak values ‣Timed expiration ‣On-demand computation of valuesFar more powerful, easy to use than WeakHashMapConcurrent on-demand computation is really hard
  71. 71. MapMakerConcurrentMap<User, Graph> recommendations = new MapMaker() .concurrencyLevel(4) .softKeys() .weakValues() .maximumSize(10000) .expireAfterWrite(10, TimeUnit.MINUTES) .makeComputingMap( new Function<User, Graph>() { public Graph apply(User user) { return createExpensiveGraph(user); } });
  72. 72. Forwarding Object/Collections Abstract implementations of existing types delegating all method calls to its delegate() protected abstract Object delegate(); Decorator pattern without the burden ;)
  73. 73. Forwarding Collections ForwardingCollection ForwardingMultisetForwardingConcurrentMap ForwardingObject ForwardingIterator ForwardingQueue ForwardingList ForwardingSet ForwardingListIterator ForwardingSetMultimap ForwardingListMultimap ForwardingSortedMap ForwardingMap ForwardingSortedSet ForwardingMapEntry ForwardingSortedSetMultimap ForwardingMultimap ForwardingTable
  74. 74. Static utilitiesIn classes with name ending with an s ‣ Lists ‣ Maps ‣ Multimaps ‣ Multisets ‣ Sets ‣ SortedMaps ‣ Tables ‣ Iterators ‣ Iterables ‣ Collections2
  75. 75. Static factories methods +1Rather than typing Map<String, Class<? extends Handler>> m = new HashMap<String, Class<? extends Handler>>();you type Map<String, Class<? extends Handler>> m2 = Maps.newHashMap(); Guava provides these for JDK collections and for Guava collections (Multi*...) With overloads to accept Iterables to copy elements from
  76. 76. Maps as index +1Maps.uniqueIndex() Map<Integer, Employee> m = Maps.uniqueIndex(values, new Function<Employee, Integer>() { @Override public Integer apply(Employee input) { return input.getId(); } });
  77. 77. Multimaps as index +1Multimaps.index() Multimap<Integer, Employee> m = Multimaps.index(values, new Function<Employee, Integer>() { @Override public Integer apply(Employee input) { return input.getYearsOfService(); } });
  78. 78. Map differences +1 So you want to compute the differences between two maps Guava has it too Maps.difference( Map<? extends K,? extends V>, Map<? extends K,? extends V>)Difference is an immutable snapshot of the state of the maps at the time this method is called
  79. 79. MapDifference API Map<K,V> entriesInCommon() Map<K,V> entriesOnlyOnLeft() Map<K,V> entriesOnlyOnRight()Map<K,MapDifference.ValueDifference<V>> entriesDiffering() ValueDifference API V leftValue() V rightValue()
  80. 80. Sets union/intersection/difference +1difference(Set<E>, Set<?>)symmetricDifference(Set<? extends E>, Set<? extends E>)union(Set<? extends E>, Set<? extends E>)intersection(Set<E>, Set<?>) Returns Sets.SetView<E>
  81. 81. Sets combinationsSet<Set<E>> powerSet(Set<E>) while the power set of a set with size n is of size 2^n, its memory usage is only O(n)Set<List<B>> cartesianProduct( List<? extends Set<? extends B>>) while the cartesian product of sets of size m, n, p is a set of size m x n x p, its actual memory consumption is much smaller (m + n + p)
  82. 82. Immutable collections JDK has Collections.unmodifiableFoo wrappers ‣Unmodifiable - you cant change it ‣Immutable - it can never change, no matter what ‣Immutability is tasty! ‣See Effective Java Item 15 for some of the many reasonshttp://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  83. 83. Immutable collections +1 ImmutableList ImmutableSet ImmutableMap ImmutableSortedMap ImmutableSortedSet ImmutableMultiset ImmutableMultimap ImmutableListMultimap ImmutableSetMultimap ImmutableBiMaphttp://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  84. 84. Immutable collections JDK wrappers still useful for unmodifiable views of changing data. But for most purposes, use Guava’s: ‣Brand-new, standalone implementations ‣Immutability guaranteed! ‣Very easy to use ‣See following slides ‣Slightly faster ‣Null hostile ‣Use less memory ‣Sometimes far less (ImmutableSet, factor of 2-3x)http://google-collections.googlecode.com/files/google-collections-svgtug-2008-08-06.pdf
  85. 85. Immutable collectionsFactory methods ImmutableXXX.of() immutable empty XXX ImmutableXXX.of(E) singletons ImmutableXXX.of(E, E) ImmutableXXX.of(E, E, E, E...) ImmutableXXX.copyOf(Iterable) ImmutableXXX.copyOf(Iterator) small maps only (up ImmutableMap.of(1, "one", 2, "two") to 5 key/value pairs) ImmutableMap.copyOf(Map)Builder pattern otherwise
  86. 86. Constants Sets public static final Set<Integer> LUCKY_NUMBERS; static { Set<Integer> set = new LinkedHashSet<Integer>(); set.add(4); set.add(8); set.add(15); set.add(16); set.add(23); set.add(42); LUCKY_NUMBERS = Collections.unmodifiableSet(set); }http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  87. 87. Constants Sets public static final Set<Integer> LUCKY_NUMBERS = Collections .unmodifiableSet( new LinkedHashSet<Integer>( Arrays.asList(4, 8, 15, 16, 23, 42))); A little nicer. But uses four different classes! Somethings weird.http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  88. 88. Constants Sets public static final ImmutableSet<Integer> LUCKY_NUMBERS = ImmutableSet.of(4, 8, 15, 16, 23, 42); Now we just say exactly what we mean. And get performance benefits as well! Were using just one class (it implements Set) of() method name inspired by java.util.EnumSethttp://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  89. 89. Constants Maps public static final Map<String, Integer> ENGLISH_TO_INT; static { Map<String, Integer> map = new LinkedHashMap<String, Integer>(); map.put("four", 4); map.put("eight", 8); map.put("fifteen", 15); map.put("sixteen", 16); map.put("twenty-three", 23); map.put("forty-two", 42); ENGLISH_TO_INT = Collections.unmodifiableMap(map); }http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  90. 90. Constants Maps public static final ImmutableMap<String, Integer> ENGLISH_TO_INT = ImmutableMap.<String,Integer>builder() .put("four", 4) .put("eight", 8) .put("fifteen", 15) .put("sixteen", 16) Empowering the .put("twenty-three", 23) Builder Pattern! .put("forty-two", 42) .build();http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  91. 91. Table @Beta since r07Collection with columns and rowsNo more Map<T1, Map<T2,T3>>Table<R,C,V> composed of Table.Cell<R,C,V>Tables.transpose() (flips row and column keys) 6 views 2 impl. Set<Table.Cell<R,C,V>> cellSet() Map<R,V> column(C) HashBasedTable Set<C> columnKeySet() TreeBasedTable Map<C,Map<R,V>> columnMap() Map<C,V> row(R) Set<R> rowKeySet() Map<R,Map<C,V>> rowMap()
  92. 92. http://www.flickr.com/photos/leamarzloff/3085027173/ Functionnal flavor 6
  93. 93. in com.google.common.base package public interface Predicate<T> { Predicate<T> to filter boolean apply(T from); out a collection } {public interface Function<F, T> T apply(F from); Function<F, T> to} transform a collection
  94. 94. in com.google.common.collect package Iterables.filter() Iterators.filter() Collections2.filter() Sets.filter()http://www.flickr.com/photos/luis_is_rubbish_at_photography/5464233571/
  95. 95. 24 42 13 7 128public static void demo(Collection<Integer> c) { Predicate<Integer> isEven = new Predicate<Integer>() { @Override public boolean apply(Integer input) { return (input.intValue() % 2 == 0); } }; Collection<Integer> fCol = Collections2.filter(c, isEven); } 24 42 128
  96. 96. in com.google.common.collect package Iterables.transform() Iterators.transform()Collections2.transform() Lists.transform() http://www.flickr.com/photos/brotherxii/2203037632 /
  97. 97. Apple Orange Banana Kiwi Pearpublic void demo(Collection<String> c) { Function<String, String> toUpperCase = new Function<String, String>() { @Override public String apply(String input) { return input.toUpperCase(); } }; Collection<String> tCol = Collections2.transform(c, toUpperCase); } APPLE ORANGE BANANA KIWI PEAR
  98. 98. Bewareoflazyness http://www.flickr.com/photos/torek/2467519466/
  99. 99. Copy! Lists.newArrayList() Lists.newLinkedList() Sets.newHashSet() Sets.newLinkedHashSet() Sets.newTreeSet() or make it immutable... ImmutableList.copyOf() ImmutableSet.copyOf()http://www.flickr.com/photos/visionnewspaper/314107094/
  100. 100. Compose and combine http://www.flickr.com/photos/jgscism/5484243543/Functions compose forPredicatePredicates and or not compose
  101. 101. Compose and combine Function<String, String> toUpper = new Function<String, String>() { @Override public String apply(String input) { return input.toUpperCase(); } }; Function<Integer, String> toHexString = new Function<Integer, String>() { @Override public String apply(Integer input) { return Integer.toHexString(input.intValue()); } }; Function<Integer, String> toUpperHexString = Functions.compose(toUpper, toHexString);
  102. 102. Compose and combine Predicate<String> isEmpty = new Predicate<String>() { @Override public boolean apply(String input) { return input.length() == 0; // isEmpty() is Java6 only } }; Predicate<Object> isNull = new Predicate<Object>() { @Override public boolean apply(Object input) { return input == null; } };Predicate<String> nullOfEmpty = Predicates.or(isNull, isEmpty);
  103. 103. Maps transform & filterMaps.filterEntries()Maps.filterKeys()Maps.filterValues()Maps.transformEntries()Maps.transformValues() Equivalence for Multimaps
  104. 104. Primitives 7
  105. 105. common.primitives package that helps you work with the primitive types int, long, double, float, char, byte, short, and boolean If you need help doing a primitive task: 1. check the wrapper class (e.g. java.lang.Integer) 2. check java.util.Arrays 3. check com.google.common.primitives 4. it might not exist!http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  106. 106. common.primitives Contains the classes Booleans, Each has the exact same structure Bytes, (but has only the subset of operations that make sense for its type). Chars, Doubles, Floats, Many of the byte-related methods Ints, have alternate versions in the classes Longs and (wait for it) SignedBytes and UnsignedBytes. (Bytes are peculiar...) Shorts Guava doesnt do primitive-based collections; try fastutil, or trove4j, or...http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  107. 107. The big table Method Longs Ints Shorts Chars Doubles Bytes S.Bytes U.Bytes Booleans hashCode x x x x x x x compare x x x x x x x x checkedCast x x x x x saturadCast x x x x x contains x x x x x x indexOf x x x x x x x lastIndexOf x x x x x x x min x x x x x x max x x x x x x concat x x x x x x x join x x x x x x x toArray x x x x x x x asList x x x x x x x lexComparator x x x x x x x toByteArray x x x x fromByteArray x x x xhttp://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  108. 108. http://www.flickr.com/photos/buzzingbye/222969493/ IO & Network 8
  109. 109. common.io 2 key interfaces public interface InputSupplier<T> { T getInput() throws IOException; } Typically: public interface OutputSupplier<T> { InputSupplier<InputStream>, OutputSupplier<Writer>, etc. T getOutput() throws IOException; } This lets all Guava’s utilities be useful for many kinds of I/O. Terminology ‣ byte stream means "InputStream or OutputStream" ByteStreams utilities class ‣ char stream means "Reader or Writer." CharStreams utilities classhttp://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  110. 110. ByteStreams ‣byte[] toByteArray(InputStream) ‣byte[] toByteArray(InputSupplier) ‣void readFully(InputStream, byte[]) ‣void write(byte[], OutputSupplier) ‣long copy(InputStream, OutputStream) ‣long copy(InputSupplier, OutputSupplier) ‣long length(InputSupplier) ‣boolean equal(InputSupplier, InputSupplier) ‣InputSupplier slice(InputSupplier, long, long) ‣InputSupplier join(InputSupplier...) CharStreams is similar, but deals in Reader, Writer, String and CharSequence (often requiring you to specify a Charset).http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  111. 111. Files The Files class works one level higher than ByteStreams and CharStreams byte[] toByteArray(File) void write(byte[], File) void write(CharSequence, File, Charset) long copy(File, File) long copy(InputSupplier, File) long copy(File, OutputSupplier) long copy(File, Charset, Appendable) long move(File, File) boolean equal(File, File)http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  112. 112. More about Files File createTempDir() void deleteDirectoryContents(File) void deleteRecursively(File) long getChecksum(File, Checksum) byte[] getDigest(File, MessageDigest) String readFirstLine(File, Charset) List<String> readLines(File, Charset) T readLines(File, Charset, LineProcessor<T>) String toString(File, Charset)http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  113. 113. Flushab les and Closeables Flushables.flushQuietly(Flushable flushable) Flushables.flush( Flushable flushable, boolean swallowIOException) throws IOException Closeables.closeQuietly(Closeable closeable) Closeables.close( Closeable closeable, boolean swallowIOException) throws IOException Very usefull in finally blocks (avoid nesting try/catch)http://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  114. 114. common.net ‣URI Work with literals of: ‣URL ‣@IP (v4/v6) Never cause DNS services to be accessed (JDK does...) HostSpecifier syntactically valid host specifier, suitable for use in a URI InternetDomainName ~RFC 1035, i18n DN InetAddresses utility pertaining to Inet(4|6)Address instanceshttp://guava-libraries.googlecode.com/files/Guava_for_Netflix_.pdf
  115. 115. Concurrencyhttp://www.flickr.com/photos/kh-67/3339157498/ 9
  116. 116. Concurrency in Guava Immutable* ConcurrentHashMultiset Multimaps.synchronizedMultimap MapMakerhttp://guava-libraries.googlecode.com/files/guava-concurrent-slides.pdf
  117. 117. comm on.util.concurrent It’s all about Future (as in java.util.concurrent) (never heard of it, go take a nap) "A handle to an in-progress computation." "A promise from a service to supply us with a result."http://guava-libraries.googlecode.com/files/guava-concurrent-slides.pdf
  118. 118. Future JDK Future public interface Future<V> { //... V get(); //... } Guava ListenableFuture public interface ListenableFuture<V> extends Future<V> { void addListener(Runnable r, Executor e); }http://guava-libraries.googlecode.com/files/guava-concurrent-slides.pdf
  119. 119. ListenableFuture Future with one new method: addListener When the future is done (success, exception, cancellation), the listeners run the killer app: "To serve as a foundation for higher- level abstractions" See Futureshttp://guava-libraries.googlecode.com/files/guava-concurrent-slides.pdf
  120. 120. ListenableFuture When to use? Always. (+) Most Futures methods require it. (+) Its easier than changing to ListenableFuture later. (+) Providers of utility methods wont need to provide Future and ListenableFuture variants of their methods. (−) "ListenableFuture" is lengthier than "Future." (−) Classes like ExecutorService give you a plain Future by default.http://guava-libraries.googlecode.com/files/guava-concurrent-slides.pdf
  121. 121. Transform and chain Function<QueryResult, List<Row>> rowsFunction = new Function<QueryResult, List<Row>>() { public List<Row> apply(QueryResult queryResult) { return queryResult.getRows(); } }; Future<QueryResult> queryFuture = ...; Future<List<Row>> rowsFuture = transform(queryFuture, rowsFunction);http://guava-libraries.googlecode.com/files/guava-concurrent-slides.pdf
  122. 122. Transform and chain Function<RowKey, ListenableFuture<QueryResult>> queryFunction = new Function<RowKey, ListenableFuture<QueryResult>>() { public ListenableFuture<QueryResult> apply(RowKey rowKey) { return dataService.read(rowKey); } }; ListenableFuture<RowKey> rowKeyFuture = indexService.lookUp(query); ListenableFuture<QueryResult> queryFuture = chain(rowKeyFuture, queryFunction);http://guava-libraries.googlecode.com/files/guava-concurrent-slides.pdf
  123. 123. Futures Got a Iterable<Future<V>>? Decide what you want: Future of List<V> Futures.allAsList() List of Future<V> Futures.successfulAsList()http://guava-libraries.googlecode.com/files/guava-concurrent-slides.pdf
  124. 124. Executors MoreExecutors.sameThreadExecutor for quick tasks that can run inline MoreExecutors.getExitingExecutorService for "half-daemon" threads UncaughtExceptionHandlers.systemExit for exiting after unexpected errors ThreadFactoryBuilder new ThreadFactoryBuilder() .setDaemon(true) .setNameFormat("WebRequestHandler-%d") .build();http://guava-libraries.googlecode.com/files/guava-concurrent-slides.pdf
  125. 125. Services "An object with an operational state, plus asynchronous start() and stop() lifecycle methods to transfer into and out of this state." Example: web servers, RPC servers, monitoring initialization, ...http://guava-libraries.googlecode.com/files/guava-concurrent-slides.pdf
  126. 126. Services AbstractExecutionThreadService One thread automatically created for you at startup AbstractIdleService Thread only needed for startup and shutdown (e.g., service that already has its own thread) AbstractService Full control over threads creationhttp://guava-libraries.googlecode.com/files/guava-concurrent-slides.pdf
  127. 127. EMF for dummieshttp://www.flickr.com/photos/bendylan/259110679/ 10
  128. 128. Java Framework and code generation facility "Class diagram to Super Java Bean" (My definition)
  129. 129. Ab out those modeling things‣It’s just about defining the entities/concepts/classesyou will manipulate‣You can define concepts in several ways ‣Annotated Java classes ‣XML Schema ‣Ecore file ‣UML Class diagram‣You give the input to EMF, and it handles conversionand generation of the ULTIMATE POJO API
  130. 130. Ab out those modeling things‣Thin framework layer inserted into your POJO ‣you can even hide it ;)‣The layer is as thin as imaginable and provides highpower-to-weight ratio ‣opposite references ‣adapters ‣edit ‣lazy loading ‣serialization (REST) ‣factory ‣reflective calls / metadata generation
  131. 131. Ab out those modeling thingsWhat can you define in Ecore files? ‣Package ‣Classes ‣Attributes ‣References
  132. 132. Ab out those modeling things ‣Packages Logical organization ‣Classes Classical OO concepts ‣Attributes Primitive type fields (with cardinality) ‣References Class type fields (with cardinality), opposite, containment
  133. 133. EObject?The thin layer that changes it all Object eGet(EStructuralFeature feature); void eSet(EStructuralFeature feature, Object newValue); boolean eIsSet(EStructuralFeature feature); void eUnset(EStructuralFeature feature); EList<EObject> eContents(); TreeIterator<EObject> eAllContents(); EObject eContainer();
  134. 134. time to play 883/ /photos/8728229@N07/4592234http://www.flickr.com http://www.flickr.com/photos/squonk /1715142327/
  135. 135. EMFPathhttp://www.flickr.com/photos/eseartista/1604034788/ 11
  136. 136. Path
  137. 137. { public interface Function<F, T> Set of functions and } T apply(F from); public interface Predicate<T> {predicates for EMF objects } boolean apply(T from); Code generators for your own Ecore modelsand few other utility classes
  138. 138. Lazy EObjects containment tree walking ‣ parent (eContainer) ‣ ancestor ‣ ancestorOrSelf ‣ child (eContents) ‣ descendant (eAllContents) 445978272/ ‣ descendantOrSelf ‣ following http://www.flickr.com/photos/musiclovenature/1 ‣ followingSibling ‣ preceding ‣ precedingSibling EObject myObject; Collection<EObject> fs = followingSibling.of(myObject);
  139. 139. Common predicates Having IsKind/IsType IsAncestor/IsChild public static Collection<EObject> demoHaving(Collection<EObject> c) { return Collections2.filter(c, Having.feature(EcorePackage.Literals.ENAMED_ELEMENT__NAME, StringPredicates.firstUpperCase) ); }
  140. 140. non-EMF functions & predicates Stringslength : Function<String, Integer>toL1Case : Function<String, String> ComparabletoLowerCase : Function<String, String>toU1Case : Function<String, String> Predicates totoUpperCase : Function<String, String> test ordering:trim : Function<String, String> equal replaceAll(Pattern, String) less than replaceAll(String, String) greater than replaceFirst(Pattern, String) less or equal replaceFirst(String, String) greater or equal substring(int) substring(int, int)
  141. 141. Ecore API has been Guava-ified‣ EObject.eResource() is wrapped as a Function inEObjectPath.eResource‣ EObject.eIsProxy() is wrapped as a Predicate inEObjectPath.eIsProxy‣ EClass.getESuperTypes() is wrapped as aFunction in EClass.eSuperTypes‣ EReference.isContainment() is wrapped as aPredicate in ERefrencePath.isContainment
  142. 142. Ecore has been Guava-ified through a generator + that is available for your own Ecore model
  143. 143. time to play 883/ /photos/8728229@N07/4592234http://www.flickr.com http://www.flickr.com/photos/squonk /1715142327/
  144. 144. Recaphttp://www.flickr.com/photos/loty/326761635/ 12
  145. 145. Wha t you should remember about this presentation1. Functionnal flavor of collection handling2. CharMatcher / Splitter / Joiner3. Immutable Collections4. Multimap / Multiset / Bimap5. MapMaker6. EMF is generating plain old POJO
  146. 146. What you should REALLY remember about this presentation1. Guava is cool, powerful and the definitiveextension to JDK!2. Never write your own POJO by hand fornow, use EMF!3. Always generate EMFPath classes tohandle EMF objects! http://code.google.com/p/guava-libraries/ http://code.google.com/p/guava-osgi/ http://eclipse.org/modeling/emf/http://code.google.com/a/eclipselabs.org/p/emfpath/
  147. 147. http://www.flickr.com/photos/wwworks/4759535950/Q&A
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×