SlideShare une entreprise Scribd logo
1  sur  33
Télécharger pour lire hors ligne
Google Guava


by Yuriy Krutko
Java Developer
Common Myths

Guava is a fruit
Guavas (singular Guava, English pronunciation: /ˈgwɑː.və/[2]) are
plants in the Myrtle family (Myrtaceae) genus Psidium (meaning
"pomegranate" in Latin)




Guava is Google Collections
Guava misuses functional idioms
What's inside
                Strings            Ordering            Throwables


Concurrency
                   Preconditions          Collections


   Reflection                                           EventBus
                           Objects


     Hashing                                  Caches
                    I/O
                               Math

                                               Primitives
          Ranges
Why Guava?
• Guava is a productivity multiplier
• I Could've Invented That
• "Know and use the libraries”
• Don't reinvent the wheel.
• Could not be included into Java API
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.
equals, hashCode, toString

Code it yourself
Generate using tools (e.g. Eclipse)
Use Guava Objects class
Generated
private String firstName;
private String secondName;

@Override
public String toString() {
    return "PersonGenerated [firstName=" + firstName
            + ", secondName=" + secondName + "]";
}

@Override
public 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;
}
Generate
@Override
public 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;
}
Objects
private String firstName;
private String secondName;

@Override
public int hashCode() {
    return Objects.hashCode(firstName, secondName);
}

@Override
public 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;
}

@Override
public String toString() {
    return Objects.toStringHelper(this)
            .add("firstName", firstName)
            .add("secondName", secondName)
            .toString();
}
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;
}
Compare while equal
public 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;
            }
        };
    }

}
Compare while equal
public 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;
            }
        };
    }

}
Compare while equal
public 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;
            }
        };
    }

}
Compare while equal
public 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;
            }
        };
    }

}
Compare while equal
public 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;
            }
        };
    }

}
Better Nulls
public 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;
    }
}
Failfast and Join with Joy
public class PreconditionsJoiner {
    public String joinStrings(Iterable<String> strings) {
        Preconditions.checkNotNull(strings, "Strings should not be null");
        return Joiner.on(", ").skipNulls().join(strings);
    }
}
Measure everything
public 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");
}
Fast and Immutable
public 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();
}
More collections
public 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);
Double checked locking
public 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();
    }
}
Memoize and Expire
public 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();
    }
}
Cache
public 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();
    }
}
Functional Idioms
public 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));
}
Functional Idioms
public 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();
                        }
                    }));
}
Functional Idioms
public 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));
}
Catching a Bus
public 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) {
    }
}
Catching a Bus
public 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);
        }
    }
}
Event Bus
public class BaseEvent {
}
public class SpecificEvent extends BaseEvent {
}

public class OtherSpecificEvent extends BaseEvent {
}
Event Bus
public 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());
    }
}
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
• Guava  Commons != {}
• Guava doesn't solve global tasks
• Don't shoot yourself in the foot with
  Guava
Thank you !
●   Yuriy Krutko (yuri.krutko@odnoklassniki.ru)
●   Guava (http://code.google.com/p/guava-libraries/)

Contenu connexe

Tendances

Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STMConcurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Mario Fusco
 
Scala - where objects and functions meet
Scala - where objects and functions meetScala - where objects and functions meet
Scala - where objects and functions meet
Mario Fusco
 
Old Oracle Versions
Old Oracle VersionsOld Oracle Versions
Old Oracle Versions
Jeffrey Kemp
 
The core libraries you always wanted - Google Guava
The core libraries you always wanted - Google GuavaThe core libraries you always wanted - Google Guava
The core libraries you always wanted - Google Guava
Mite Mitreski
 

Tendances (19)

Transaction is a monad
Transaction is a  monadTransaction is a  monad
Transaction is a monad
 
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STMConcurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
 
Use PEG to Write a Programming Language Parser
Use PEG to Write a Programming Language ParserUse PEG to Write a Programming Language Parser
Use PEG to Write a Programming Language Parser
 
Introduction to Functional Programming (w/ JS)
Introduction to Functional Programming (w/ JS)Introduction to Functional Programming (w/ JS)
Introduction to Functional Programming (w/ JS)
 
Scala - where objects and functions meet
Scala - where objects and functions meetScala - where objects and functions meet
Scala - where objects and functions meet
 
Kotlin collections
Kotlin collectionsKotlin collections
Kotlin collections
 
Google Guava for cleaner code
Google Guava for cleaner codeGoogle Guava for cleaner code
Google Guava for cleaner code
 
Google guava - almost everything you need to know
Google guava - almost everything you need to knowGoogle guava - almost everything you need to know
Google guava - almost everything you need to know
 
Perl
PerlPerl
Perl
 
Generic lazy class
Generic lazy classGeneric lazy class
Generic lazy class
 
Google guava
Google guavaGoogle guava
Google guava
 
Old Oracle Versions
Old Oracle VersionsOld Oracle Versions
Old Oracle Versions
 
Python functions
Python functionsPython functions
Python functions
 
The Ring programming language version 1.2 book - Part 58 of 84
The Ring programming language version 1.2 book - Part 58 of 84The Ring programming language version 1.2 book - Part 58 of 84
The Ring programming language version 1.2 book - Part 58 of 84
 
Neuroevolution in Elixir
Neuroevolution in ElixirNeuroevolution in Elixir
Neuroevolution in Elixir
 
Elixir: the not-so-hidden path to Erlang
Elixir: the not-so-hidden path to ErlangElixir: the not-so-hidden path to Erlang
Elixir: the not-so-hidden path to Erlang
 
Functional aspects of java 8
Functional aspects of java 8Functional aspects of java 8
Functional aspects of java 8
 
The core libraries you always wanted - Google Guava
The core libraries you always wanted - Google GuavaThe core libraries you always wanted - Google Guava
The core libraries you always wanted - Google Guava
 
Javascript Function
Javascript FunctionJavascript Function
Javascript Function
 

Similaire à Google Guava

import java-util-Iterator- import java-util-NoSuchElementException- im.pdf
import java-util-Iterator- import java-util-NoSuchElementException- im.pdfimport java-util-Iterator- import java-util-NoSuchElementException- im.pdf
import java-util-Iterator- import java-util-NoSuchElementException- im.pdf
Stewart29UReesa
 
For problems 3 and 4, consider the following functions that implemen.pdf
For problems 3 and 4, consider the following functions that implemen.pdfFor problems 3 and 4, consider the following functions that implemen.pdf
For problems 3 and 4, consider the following functions that implemen.pdf
anjandavid
 
Given below is the completed implementation of MyLinkedList class. O.pdf
Given below is the completed implementation of MyLinkedList class. O.pdfGiven below is the completed implementation of MyLinkedList class. O.pdf
Given below is the completed implementation of MyLinkedList class. O.pdf
info430661
 
import java.util.Iterator; import java.util.NoSuchElementException; .pdf
  import java.util.Iterator; import java.util.NoSuchElementException; .pdf  import java.util.Iterator; import java.util.NoSuchElementException; .pdf
import java.util.Iterator; import java.util.NoSuchElementException; .pdf
deepakangel
 
Scala 2013 review
Scala 2013 reviewScala 2013 review
Scala 2013 review
Sagie Davidovich
 
Club of anonimous developers "Refactoring: Legacy code"
Club of anonimous developers "Refactoring: Legacy code"Club of anonimous developers "Refactoring: Legacy code"
Club of anonimous developers "Refactoring: Legacy code"
Victor_Cr
 
For the code below complete the preOrder() method so that it perform.pdf
For the code below complete the preOrder() method so that it perform.pdfFor the code below complete the preOrder() method so that it perform.pdf
For the code below complete the preOrder() method so that it perform.pdf
xlynettalampleyxc
 
NumberList.java (implements the linked list)public class NumberLis.pdf
NumberList.java (implements the linked list)public class NumberLis.pdfNumberList.java (implements the linked list)public class NumberLis.pdf
NumberList.java (implements the linked list)public class NumberLis.pdf
anjanacottonmills
 
Here is the editable codeSolutionimport java.util.NoSuchEleme.pdf
Here is the editable codeSolutionimport java.util.NoSuchEleme.pdfHere is the editable codeSolutionimport java.util.NoSuchEleme.pdf
Here is the editable codeSolutionimport java.util.NoSuchEleme.pdf
arrowmobile
 
Easily mockingdependenciesinc++ 2
Easily mockingdependenciesinc++ 2Easily mockingdependenciesinc++ 2
Easily mockingdependenciesinc++ 2
drewz lin
 

Similaire à Google Guava (20)

This is to test a balanced tree. I need help testing an unbalanced t.pdf
This is to test a balanced tree. I need help testing an unbalanced t.pdfThis is to test a balanced tree. I need help testing an unbalanced t.pdf
This is to test a balanced tree. I need help testing an unbalanced t.pdf
 
import java-util-Iterator- import java-util-NoSuchElementException- im.pdf
import java-util-Iterator- import java-util-NoSuchElementException- im.pdfimport java-util-Iterator- import java-util-NoSuchElementException- im.pdf
import java-util-Iterator- import java-util-NoSuchElementException- im.pdf
 
Why react matters
Why react mattersWhy react matters
Why react matters
 
Java 8 - Nuts and Bold - SFEIR Benelux
Java 8 - Nuts and Bold - SFEIR BeneluxJava 8 - Nuts and Bold - SFEIR Benelux
Java 8 - Nuts and Bold - SFEIR Benelux
 
Laziness, trampolines, monoids and other functional amenities: this is not yo...
Laziness, trampolines, monoids and other functional amenities: this is not yo...Laziness, trampolines, monoids and other functional amenities: this is not yo...
Laziness, trampolines, monoids and other functional amenities: this is not yo...
 
For problems 3 and 4, consider the following functions that implemen.pdf
For problems 3 and 4, consider the following functions that implemen.pdfFor problems 3 and 4, consider the following functions that implemen.pdf
For problems 3 and 4, consider the following functions that implemen.pdf
 
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev FedorProgramming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
 
Given below is the completed implementation of MyLinkedList class. O.pdf
Given below is the completed implementation of MyLinkedList class. O.pdfGiven below is the completed implementation of MyLinkedList class. O.pdf
Given below is the completed implementation of MyLinkedList class. O.pdf
 
Sorter
SorterSorter
Sorter
 
import java.util.Iterator; import java.util.NoSuchElementException; .pdf
  import java.util.Iterator; import java.util.NoSuchElementException; .pdf  import java.util.Iterator; import java.util.NoSuchElementException; .pdf
import java.util.Iterator; import java.util.NoSuchElementException; .pdf
 
Scala 2013 review
Scala 2013 reviewScala 2013 review
Scala 2013 review
 
Mixing functional programming approaches in an object oriented language
Mixing functional programming approaches in an object oriented languageMixing functional programming approaches in an object oriented language
Mixing functional programming approaches in an object oriented language
 
Club of anonimous developers "Refactoring: Legacy code"
Club of anonimous developers "Refactoring: Legacy code"Club of anonimous developers "Refactoring: Legacy code"
Club of anonimous developers "Refactoring: Legacy code"
 
For the code below complete the preOrder() method so that it perform.pdf
For the code below complete the preOrder() method so that it perform.pdfFor the code below complete the preOrder() method so that it perform.pdf
For the code below complete the preOrder() method so that it perform.pdf
 
NumberList.java (implements the linked list)public class NumberLis.pdf
NumberList.java (implements the linked list)public class NumberLis.pdfNumberList.java (implements the linked list)public class NumberLis.pdf
NumberList.java (implements the linked list)public class NumberLis.pdf
 
Here is the editable codeSolutionimport java.util.NoSuchEleme.pdf
Here is the editable codeSolutionimport java.util.NoSuchEleme.pdfHere is the editable codeSolutionimport java.util.NoSuchEleme.pdf
Here is the editable codeSolutionimport java.util.NoSuchEleme.pdf
 
Java 8 by example!
Java 8 by example!Java 8 by example!
Java 8 by example!
 
"Java 8, Lambda e la programmazione funzionale" by Theodor Dumitrescu
"Java 8, Lambda e la programmazione funzionale" by Theodor Dumitrescu"Java 8, Lambda e la programmazione funzionale" by Theodor Dumitrescu
"Java 8, Lambda e la programmazione funzionale" by Theodor Dumitrescu
 
Scala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 WorldScala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 World
 
Easily mockingdependenciesinc++ 2
Easily mockingdependenciesinc++ 2Easily mockingdependenciesinc++ 2
Easily mockingdependenciesinc++ 2
 

Plus de Dmitry Buzdin

Developing Useful APIs
Developing Useful APIsDeveloping Useful APIs
Developing Useful APIs
Dmitry Buzdin
 
Архитектура Ленты на Одноклассниках
Архитектура Ленты на ОдноклассникахАрхитектура Ленты на Одноклассниках
Архитектура Ленты на Одноклассниках
Dmitry Buzdin
 
Riding Redis @ask.fm
Riding Redis @ask.fmRiding Redis @ask.fm
Riding Redis @ask.fm
Dmitry Buzdin
 
Rubylight JUG Contest Results Part II
Rubylight JUG Contest Results Part IIRubylight JUG Contest Results Part II
Rubylight JUG Contest Results Part II
Dmitry Buzdin
 
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching SolutionsRubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Dmitry Buzdin
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
Dmitry Buzdin
 
Poor Man's Functional Programming
Poor Man's Functional ProgrammingPoor Man's Functional Programming
Poor Man's Functional Programming
Dmitry Buzdin
 
Rubylight programming contest
Rubylight programming contestRubylight programming contest
Rubylight programming contest
Dmitry Buzdin
 
Continuous Delivery
Continuous Delivery Continuous Delivery
Continuous Delivery
Dmitry Buzdin
 
Introduction to DevOps
Introduction to DevOpsIntroduction to DevOps
Introduction to DevOps
Dmitry Buzdin
 
Thread Dump Analysis
Thread Dump AnalysisThread Dump Analysis
Thread Dump Analysis
Dmitry Buzdin
 

Plus de Dmitry Buzdin (20)

How Payment Cards Really Work?
How Payment Cards Really Work?How Payment Cards Really Work?
How Payment Cards Really Work?
 
Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?
 
How to grow your own Microservice?
How to grow your own Microservice?How to grow your own Microservice?
How to grow your own Microservice?
 
How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?
 
Delivery Pipeline for Windows Machines
Delivery Pipeline for Windows MachinesDelivery Pipeline for Windows Machines
Delivery Pipeline for Windows Machines
 
Big Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop InfrastructureBig Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop Infrastructure
 
JOOQ and Flyway
JOOQ and FlywayJOOQ and Flyway
JOOQ and Flyway
 
Developing Useful APIs
Developing Useful APIsDeveloping Useful APIs
Developing Useful APIs
 
Whats New in Java 8
Whats New in Java 8Whats New in Java 8
Whats New in Java 8
 
Архитектура Ленты на Одноклассниках
Архитектура Ленты на ОдноклассникахАрхитектура Ленты на Одноклассниках
Архитектура Ленты на Одноклассниках
 
Dart Workshop
Dart WorkshopDart Workshop
Dart Workshop
 
Riding Redis @ask.fm
Riding Redis @ask.fmRiding Redis @ask.fm
Riding Redis @ask.fm
 
Rubylight JUG Contest Results Part II
Rubylight JUG Contest Results Part IIRubylight JUG Contest Results Part II
Rubylight JUG Contest Results Part II
 
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching SolutionsRubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
Poor Man's Functional Programming
Poor Man's Functional ProgrammingPoor Man's Functional Programming
Poor Man's Functional Programming
 
Rubylight programming contest
Rubylight programming contestRubylight programming contest
Rubylight programming contest
 
Continuous Delivery
Continuous Delivery Continuous Delivery
Continuous Delivery
 
Introduction to DevOps
Introduction to DevOpsIntroduction to DevOps
Introduction to DevOps
 
Thread Dump Analysis
Thread Dump AnalysisThread Dump Analysis
Thread Dump Analysis
 

Dernier

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Dernier (20)

🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 

Google Guava

  • 1. Google Guava by Yuriy Krutko Java Developer
  • 2. Common Myths Guava is a fruit Guavas (singular Guava, English pronunciation: /ˈgwɑː.və/[2]) are plants in the Myrtle family (Myrtaceae) genus Psidium (meaning "pomegranate" in Latin) Guava is Google Collections Guava misuses functional idioms
  • 3. What's inside Strings Ordering Throwables Concurrency Preconditions Collections Reflection EventBus Objects Hashing Caches I/O Math Primitives Ranges
  • 4. Why Guava? • Guava is a productivity multiplier • I Could've Invented That • "Know and use the libraries” • Don't reinvent the wheel. • Could not be included into Java API
  • 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. equals, hashCode, toString Code it yourself Generate using tools (e.g. Eclipse) Use Guava Objects class
  • 7. Generated private String firstName; private String secondName; @Override public String toString() { return "PersonGenerated [firstName=" + firstName + ", secondName=" + secondName + "]"; } @Override public 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. Generate @Override public 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. Objects private String firstName; private String secondName; @Override public int hashCode() { return Objects.hashCode(firstName, secondName); } @Override public 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; } @Override public String toString() { return Objects.toStringHelper(this) .add("firstName", firstName) .add("secondName", secondName) .toString(); }
  • 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. Compare while equal public 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. Compare while equal public 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. Compare while equal public 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. Compare while equal public 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. Compare while equal public 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. Better Nulls public 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. Failfast and Join with Joy public class PreconditionsJoiner { public String joinStrings(Iterable<String> strings) { Preconditions.checkNotNull(strings, "Strings should not be null"); return Joiner.on(", ").skipNulls().join(strings); } }
  • 18. Measure everything public 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. Fast and Immutable public 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. More collections public 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. Double checked locking public 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. Memoize and Expire public 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. Cache public 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. Functional Idioms public 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. Functional Idioms public 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. Functional Idioms public 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. Catching a Bus public 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. Catching a Bus public 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. Event Bus public class BaseEvent { } public class SpecificEvent extends BaseEvent { } public class OtherSpecificEvent extends BaseEvent { }
  • 30. Event Bus public 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. Even more... • IO • Net • Reflect • Throwables • Hashing • Math • CaseFormat • Concurrency
  • 32. Apache Commons • Just another library • Commons > Guava (BCEL, Fvs, Email) • Guava is more consistent • Guava uses generics • Guava Commons != {} • Guava doesn't solve global tasks • Don't shoot yourself in the foot with Guava
  • 33. Thank you ! ● Yuriy Krutko (yuri.krutko@odnoklassniki.ru) ● Guava (http://code.google.com/p/guava-libraries/)