Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Google Guava & EMF @ GTUG Nantes

12.342 Aufrufe

Veröffentlicht am

Veröffentlicht in: Technologie, News & Politik
  • Login to see the comments

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