Your SlideShare is downloading. ×
0
Google Guavaby Yuriy KrutkoJava Developer
Common MythsGuava is a fruitGuavas (singular Guava, English pronunciation: /ˈgwɑː.və/[2]) areplants in the Myrtle family (...
Whats inside                Strings            Ordering            ThrowablesConcurrency                   Preconditions  ...
Why Guava?• Guava is a productivity multiplier• I Couldve Invented That• "Know and use the libraries”• Dont reinvent the w...
Guava Design Principles• API is the best solution for use case.• Obvious and intuitive outside. "Smart" inside.• Encourage...
equals, hashCode, toStringCode it yourselfGenerate using tools (e.g. Eclipse)Use Guava Objects class
Generatedprivate String firstName;private String secondName;@Overridepublic String toString() {    return "PersonGenerated...
Generate@Overridepublic boolean equals(Object obj) {    if (this == obj)        return true;    if (obj == null)        re...
Objectsprivate String firstName;private String secondName;@Overridepublic int hashCode() {    return Objects.hashCode(firs...
Puzzler    Objects.hashCode(a) == a.hashCode() ?Arrays.hashCode(new Object[] { a }) == a.hashCode() ?public static int has...
Compare while equalpublic class PairOfInts {    private int first;    private int second;    public static Comparator<Pair...
Compare while equalpublic class PairOfInts {    private int first;    private int second;                                 ...
Compare while equalpublic class PairOfInts {    private int first;    private int second;    public static Comparator<Pair...
Compare while equalpublic class PairOfInts {    private int first;    private int second;    public static Comparator<Pair...
Compare while equalpublic class PairOfInts {    private int first;    private int second;    public static Comparator<Pair...
Better Nullspublic class BetterNulls {    public static final String DEFAULT = "default";    public String neverNullDefaul...
Failfast and Join with Joypublic class PreconditionsJoiner {    public String joinStrings(Iterable<String> strings) {     ...
Measure everythingpublic void measureSomething() {    Stopwatch stopwatch = new Stopwatch();    for (int i = 0; i < COUNT;...
Fast and Immutablepublic List<Integer> createList(int[] elements) {    return ImmutableList.copyOf(Ints.asList(elements));...
More collectionspublic void biMap() {    BiMap<Integer, String> biMap = HashBiMap.create();    BiMap<String, Integer> inve...
Double checked lockingpublic class DCL {    private static final Supplier<Object> supplier = Suppliers            .memoize...
Memoize and Expirepublic class DCLExp {    private static final Supplier<Object> supplier = Suppliers            .memoizeW...
Cachepublic class CacheSample {    private final LoadingCache<String, Object> cache = CacheBuilder.newBuilder()           ...
Functional Idiomspublic static Multiset<Integer> one(Iterable<String> strings) {    Function<String, Integer> lengthFuncti...
Functional Idiomspublic static Multiset<Integer> two(Iterable<String> strings) {    return HashMultiset.create(           ...
Functional Idiomspublic static Multiset<Integer> one(Iterable<String> strings) { {                                three(It...
Catching a Buspublic class BaseEvent {}public class SpecificEvent extends BaseEvent {}public class OtherSpecificEvent exte...
Catching a Buspublic class EventDispatcher {    private List<EventListener> listeners = new CopyOnWriteArrayList<EventList...
Event Buspublic class BaseEvent {}public class SpecificEvent extends BaseEvent {}public class OtherSpecificEvent extends B...
Event Buspublic class EBExample {    private static final EventBus eventBus = new EventBus();    public static void main(S...
Even more...• IO• Net• Reflect• Throwables• Hashing• Math• CaseFormat• Concurrency
Apache Commons• Just another library• Commons > Guava (BCEL, Fvs, Email)• Guava is more consistent• Guava uses generics• G...
Thank you !●   Yuriy Krutko (yuri.krutko@odnoklassniki.ru)●   Guava (http://code.google.com/p/guava-libraries/)
Upcoming SlideShare
Loading in...5
×

Google Guava

835

Published on

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
835
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
39
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Transcript of "Google Guava"

  1. 1. Google Guavaby Yuriy KrutkoJava Developer
  2. 2. Common MythsGuava is a fruitGuavas (singular Guava, English pronunciation: /ˈgwɑː.və/[2]) areplants in the Myrtle family (Myrtaceae) genus Psidium (meaning"pomegranate" in Latin)Guava is Google CollectionsGuava misuses functional idioms
  3. 3. Whats inside Strings Ordering ThrowablesConcurrency Preconditions Collections Reflection EventBus Objects Hashing Caches I/O Math Primitives Ranges
  4. 4. Why Guava?• Guava is a productivity multiplier• I Couldve Invented That• "Know and use the libraries”• Dont reinvent the wheel.• Could not be included into Java API
  5. 5. Guava Design Principles• API is the best solution for use case.• Obvious and intuitive outside. "Smart" inside.• Encourage good code habits.• Generic tools that can be composed.• Emphasize maintainability.
  6. 6. equals, hashCode, toStringCode it yourselfGenerate using tools (e.g. Eclipse)Use Guava Objects class
  7. 7. Generatedprivate String firstName;private String secondName;@Overridepublic String toString() { return "PersonGenerated [firstName=" + firstName + ", secondName=" + secondName + "]";}@Overridepublic int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((firstName == null) ? 0 : firstName.hashCode()); result = prime * result + ((secondName == null) ? 0 : secondName.hashCode()); return result;}
  8. 8. Generate@Overridepublic boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; PersonGenerated other = (PersonGenerated) obj; if (firstName == null) { if (other.firstName != null) return false; } else if (!firstName.equals(other.firstName)) return false; if (secondName == null) { if (other.secondName != null) return false; } else if (!secondName.equals(other.secondName)) return false; return true;}
  9. 9. Objectsprivate String firstName;private String secondName;@Overridepublic int hashCode() { return Objects.hashCode(firstName, secondName);}@Overridepublic boolean equals(Object obj) { if (obj instanceof PersonGuava) { PersonGuava other = (PersonGuava) obj; return Objects.equal(firstName, other.firstName) && Objects.equal(secondName, other.secondName); } return false;}@Overridepublic String toString() { return Objects.toStringHelper(this) .add("firstName", firstName) .add("secondName", secondName) .toString();}
  10. 10. Puzzler Objects.hashCode(a) == a.hashCode() ?Arrays.hashCode(new Object[] { a }) == a.hashCode() ?public static int hashCode(Object a[]) { if (a == null) return 0; int result = 1; for (Object element : a) result = 31 * result + (element == null ? 0 : element.hashCode()); return result;}
  11. 11. Compare while equalpublic class PairOfInts { private int first; private int second; public static Comparator<PairOfInts> comparator() { return new Comparator<PairOfInts>() { @Override public int compare(PairOfInts p1, PairOfInts p2) { if (p1.first < p2.first) { return -1; } if (p1.first == p2.first) { if (p1.second < p2.second) { return -1; } if (p1.second == p2.second) { return 0; } } return 1; } }; }}
  12. 12. Compare while equalpublic class PairOfInts { private int first; private int second; comparatorInts() { public static Comparator<PairOfInts> comparator() { return new Comparator<PairOfInts>() { @Override public int compare(PairOfInts p1, PairOfInts p2) { int res = Ints.compare(p1.first, p2.first); if (p1.first < p2.first) { if (res == 0) { return -1; } return Ints.compare(p1.second, p2.second); } if (p1.first == p2.first) { return res; if (p1.second < p2.second) { } return -1; }; } } if (p1.second == p2.second) { return 0; } } return 1; } }; }}
  13. 13. Compare while equalpublic class PairOfInts { private int first; private int second; public static Comparator<PairOfInts> comparator() { Ordering<PairOfInts> ordering() { comparatorInts() { Ordering.from(new Comparator<PairOfInts>() { return new Comparator<PairOfInts>() { @Override public int compare(PairOfInts p1, PairOfInts p2) { return = Ints.compare(p1.first, p2.first); int resInts.compare(p1.first, p2.first); if (p1.first < p2.first) { } if (res == 0) { return -1; }).compound(new Comparator<PairOfInts>() { p2.second); } return Ints.compare(p1.second, @Override } if (p1.first == p2.first) { public int res; return compare(PairOfInts p1, PairOfInts p2) { if (p1.second < p2.second) { } return Ints.compare(p1.second, p2.second); return -1; }; } } } }); if (p1.second == p2.second) { } return 0; } } return 1; } }; }}
  14. 14. Compare while equalpublic class PairOfInts { private int first; private int second; public static Comparator<PairOfInts> comparator() { Ordering<PairOfInts> ordering() { orderingLexicographical() { comparatorInts() { Ordering.<Comparable<?>> natural() Ordering.from(new Comparator<PairOfInts>() { return new Comparator<PairOfInts>() { .lexicographical().onResultOf( @Override public int compare(PairOfIntsIterable<Comparable<?>>>() { new Function<PairOfInts, p1, PairOfInts p2) { return = Ints.compare(p1.first, p2.first); int resInts.compare(p1.first, p2.first); @Override if (p1.first < p2.first) { } if (res == 0) { public Iterable<Comparable<?>> apply(PairOfInts pair) { return -1; }).compound(new Comparator<PairOfInts>() { p2.second); } return Ints.compare(p1.second, return ImmutableList.<Comparable<?>> @Override } of(pair.first, pair.second); if (p1.first == p2.first) { public int res; return compare(PairOfInts p1, PairOfInts p2) { } if (p1.second < p2.second) { } }); return Ints.compare(p1.second, p2.second); return -1; } }; } } } }); if (p1.second == p2.second) { } return 0; } } return 1; } }; }}
  15. 15. Compare while equalpublic class PairOfInts { private int first; private int second; public static Comparator<PairOfInts> comparator() { Ordering<PairOfInts> ordering() { orderingLexicographical() { comparatorInts() { Ordering.<Comparable<?>> natural() Ordering.from(new Comparator<PairOfInts>() { return new Comparator<PairOfInts>() { .lexicographical().onResultOf( @Override public int compare(PairOfIntsIterable<Comparable<?>>>() { new Function<PairOfInts, p1, PairOfInts p2) { return = Ints.compare(p1.first, p2.first); int resInts.compare(p1.first, p2.first); @Override if (p1.first < p2.first) { } if (res == 0) { public Iterable<Comparable<?>> apply(PairOfInts pair) { return -1; }).compound(new Comparator<PairOfInts>() { p2.second); } return Ints.compare(p1.second, return ImmutableList.<Comparable<?>> @Override } of(pair.first, pair.second); if (p1.first == p2.first) { public int res; return compare(PairOfInts p1, PairOfInts p2) { } if (p1.second < p2.second) { } }); return Ints.compare(p1.second, p2.second); return -1; } }; } } } }); if (p1.second == p2.second) { } return 0; } } return 1; } }; }}
  16. 16. Better Nullspublic class BetterNulls { public static final String DEFAULT = "default"; public String neverNullDefault(String value) { return Objects.firstNonNull(value, DEFAULT); } public String neverNullEmpty(String value) { return Strings.nullToEmpty(value); } public String getValueByKey(String key, Map<String, String> map) { return Functions.forMap(map, DEFAULT).apply(key); } public Optional<String> getValueByKeyOptional(String key, Map<String, String> map) { if (map.containsKey(key)) { return Optional.fromNullable(map.get(key)); } return null; }}
  17. 17. Failfast and Join with Joypublic class PreconditionsJoiner { public String joinStrings(Iterable<String> strings) { Preconditions.checkNotNull(strings, "Strings should not be null"); return Joiner.on(", ").skipNulls().join(strings); }}
  18. 18. Measure everythingpublic void measureSomething() { Stopwatch stopwatch = new Stopwatch(); for (int i = 0; i < COUNT; i++) { stopwatch.start(); doSomething(); stopwatch.stop(); doUnimpotantThing(); stopwatch.start(); doOtherThing(); stopwatch.stop(); } System.out.println("Average execution time " + stopwatch.elapsedTime(TimeUnit.NANOSECONDS) / COUNT + "ns");}
  19. 19. Fast and Immutablepublic List<Integer> createList(int[] elements) { return ImmutableList.copyOf(Ints.asList(elements));}public Map<String, String> createMap() { return ImmutableMap.of("key1", "val1", "key2", "val2");}public Map<String, String> buildMap() { return ImmutableMap.<String, String> builder() .put("key1", "val1") .put("key2", "val2") .build();}
  20. 20. More collectionspublic void biMap() { BiMap<Integer, String> biMap = HashBiMap.create(); BiMap<String, Integer> inverseBiMap = biMap.inverse();}public void multimap() { Multimap<Integer, String> multiMap = ArrayListMultimap.create(); multiMap.put(10, "val1"); multiMap.put(10, "val2"); Collection<String> values = multiMap.get(10);}Table<Vertex, Vertex, Double> weightedGraph = HashBasedTable.create();weightedGraph.put(v1, v2, 4.0);weightedGraph.put(v1, v3, 20.0);weightedGraph.put(v2, v3, 5.0);Map<Vertex, Double> row = weightedGraph.row(v1);Map<Vertex, Double> column = weightedGraph.column(v3);
  21. 21. Double checked lockingpublic class DCL { private static final Supplier<Object> supplier = Suppliers .memoize(new Supplier<Object>() { @Override public Object get() { return loadResource(); } }); private static Object loadResource() { return new Object(); } public static Object getResource() { return supplier.get(); }}
  22. 22. Memoize and Expirepublic class DCLExp { private static final Supplier<Object> supplier = Suppliers .memoizeWithExpiration(new Supplier<Object>() { @Override public Object get() { return loadResource(); } }, 10, TimeUnit.MINUTES); private static Object loadResource() { return new Object(); } public static Object getResource() { return supplier.get(); }}
  23. 23. Cachepublic class CacheSample { private final LoadingCache<String, Object> cache = CacheBuilder.newBuilder() .maximumSize(1000) .initialCapacity(100) .concurrencyLevel(10) .expireAfterAccess(30, TimeUnit.SECONDS) .recordStats() .build(new CacheLoader<String, Object>() { @Override public Object load(String key) throws Exception { return loadResourceByKey(key); } }); private Object loadResourceByKey(String key) { return new Object(); } public Object getCachedValue(String key) { return cache.getUnchecked(key); } public CacheStats getStats() { return cache.stats(); }}
  24. 24. Functional Idiomspublic static Multiset<Integer> one(Iterable<String> strings) { Function<String, Integer> lengthFunction = new Function<String, Integer>() { @Override public Integer apply(String string) { return string.length(); } }; Predicate<String> allCaps = new Predicate<String>() { @Override public boolean apply(String string) { return CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string); } }; return HashMultiset.create(Iterables.transform( Iterables.filter(strings, allCaps), lengthFunction));}
  25. 25. Functional Idiomspublic static Multiset<Integer> two(Iterable<String> strings) { return HashMultiset.create( FluentIterable.from(strings) .filter(new Predicate<String>() { @Override public boolean apply(String string) { return CharMatcher.JAVA_UPPER_CASE .matchesAllOf(string); } }) .transform(new Function<String, Integer>() { @Override public Integer apply(String string) { return string.length(); } }));}
  26. 26. Functional Idiomspublic static Multiset<Integer> one(Iterable<String> strings) { { three(Iterable<String> strings) Function<String, Integer> lengthFunction = new Function<String, Integer>() { Multiset<Integer> lengths = HashMultiset.create(); for @Override (String string : strings) { public Integer apply(String string) { if (CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string)) { return string.length(); lengths.add(string.length()); } }; } Predicate<String> allCaps = new Predicate<String>() { return lengths;} @Override public boolean apply(String string) { return CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string); } }; return HashMultiset.create(Iterables.transform( Iterables.filter(strings, allCaps), lengthFunction));}
  27. 27. Catching a Buspublic class BaseEvent {}public class SpecificEvent extends BaseEvent {}public class OtherSpecificEvent extends BaseEvent {}public interface EventListener { void handleSpecific(SpecificEvent event); void handleOtherSpecific(OtherSpecificEvent event);}public class EventListenerAdapter implements EventListener { @Override public void handleSpecific(SpecificEvent event) { } @Override public void handleOtherSpecific(OtherSpecificEvent event) { }}
  28. 28. Catching a Buspublic class EventDispatcher { private List<EventListener> listeners = new CopyOnWriteArrayList<EventListener>(); public void addListener(EventListener listener) { listeners.add(listener); } public void removeListener(EventListener listener) { listeners.add(listener); } public void fireSpecific(SpecificEvent event) { for (EventListener listener : listeners) { listener.handleSpecific(event); } } public void fireOtherSpecific(OtherSpecificEvent event) { for (EventListener listener : listeners) { listener.handleOtherSpecific(event); } }}
  29. 29. Event Buspublic class BaseEvent {}public class SpecificEvent extends BaseEvent {}public class OtherSpecificEvent extends BaseEvent {}
  30. 30. Event Buspublic class EBExample { private static final EventBus eventBus = new EventBus(); public static void main(String[] args) { eventBus.register(new Object() { @Subscribe public void handle(SpecificEvent event) { System.out.println("SpecificEvent: " + event.getClass()); } }); eventBus.register(new Object() { @Subscribe @AllowConcurrentEvents public void handle(BaseEvent event) { System.out.println("BaseEvent: " + event.getClass()); } }); eventBus.post(new SpecificEvent()); }}
  31. 31. Even more...• IO• Net• Reflect• Throwables• Hashing• Math• CaseFormat• Concurrency
  32. 32. Apache Commons• Just another library• Commons > Guava (BCEL, Fvs, Email)• Guava is more consistent• Guava uses generics• Guava Commons != {}• Guava doesnt solve global tasks• Dont shoot yourself in the foot with Guava
  33. 33. Thank you !● Yuriy Krutko (yuri.krutko@odnoklassniki.ru)● Guava (http://code.google.com/p/guava-libraries/)
  1. A particular slide catching your eye?

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

×