Skip to main content
Google
Guava
Scott
Leberknight
"Guava is the open-sourced version of
Google's core Java libraries: the core utilities
that Googlers use every day in their code."
"Guava has been battle-tested in
production at Google"
"Guava has staggering numbers of unit
tests: as of July 2012, the guava-tests
package includes over 286,000
individual test cases."
WAT???
"Guava is under active development and
has a strong, vocal, and involved user base."
collections
concurrency
primitives
reflection
comparison
I/o
math
strings
hashing
caching
in-memory pub/sub
net/http
Examples...
preconditions
checkArgument(age >= drinkingAge,
"age must be greater than %s", drinkingAge);
checkNotNull(input, "input cannot be null");
"Null sucks" - Doug Lea
avoiding nulls
Optional<String> value = Optional.fromNullable(str);
if (value.isPresent()) {
// ...
}
joining strings
List<String> fruits =
Arrays.asList("apple", null, "orange", null, null, "guava");
String joined = Joiner.on(", ").skipNulls().join(fruits);
// "apple, orange, guava"
List<String> fruits =
Arrays.asList("apple", null, "orange", null, null, "guava");
String joined =
Joiner.on(", ).useForNull("banana").join(fruits);
// "apple, banana, orange, banana, banana, guava"
splitting strings
String input = ",, ,apple, orange ,,, banana,, ,guava, ,,";
Iterable<String> split =
Splitter.on(',').omitEmptyStrings().trimResults().split(input);
// [ "apple", "orange", "banana", "guava" ]
CharMatcher
CharMatcher matcher =
CharMatcher.DIGIT.or(inRange('a', 'z').or(inRange('A', 'Z')));
if (matcher.matchesAllOf("this1will2match3")) {
// ...
}
String input = " secret passcode ";
String result = CharMatcher.WHITESPACE.trimFrom(input);
Objects
Objects.equal
Objects.toStringHelper
compareTo() via ComparisonChain
Ordering
Multiset
Track frequencies of
elements, e.g. "word counting"
Iterable<String> words = Splitter.on(' ').split(document);
Multiset<String> wordCounts = HashMultiset.create(words);
for (Multiset.Entry<String> entry : wordCounts.entrySet()) {
String word = entry.getElement();
int count = counts.count(element);
System.out.printf("%s appears %d timesn", word, count);
}
Map<String, List<String>>
Tired of this?
Multimap
Multimap<String, String> mm =
ArrayListMultimap.create();
Collection<String> smiths = mm.get("Smith");
// empty collection (never null)
mm.put("Smith", "John");
mm.put("Smith", "Alice");
mm.put("Smith", "Diane");
smiths = mm.get("Smith");
// [ "John", "Alice", "Diane" ]
Sets
Set<String> set1 = Sets.newHashSet("apple", "orange", "guava");
Set<String> set2 = Sets.newHashSet("guava", "clementine");
Sets.SetView<String> diff1to2 = Sets.difference(set1, set2);
// "apple", "orange"
Sets.SetView<String> diff2to1 = Sets.difference(set2, set1);
// "clementine"
Table
Table<R, C, V>
Ranges &
Domains
Range<Integer> range = Range.openClosed(0, 10);
ContiguousSet<Integer> contiguousSet =
ContiguousSet.create(range, DiscreteDomain.integers());
ImmutableList<Integer> numbers = contiguousSet.asList();
// [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
FP in Guava
FluentIterable<Integer> squaresOfEvens = FluentIterable.from(numbers)
.filter(new Predicate<Integer>() {
@Override
public boolean apply(@Nullable Integer input) {
checkNotNull(input, "nulls are not allowed here!");
return input % 2 == 0;
}
})
.transform(new Function<Integer, Integer>() {
@Nullable
@Override
public Integer apply(@Nullable Integer input) {
checkNotNull(input, "nulls are not allowed here!");
return input * input;
}
});
// [ 4, 16, 36, 64, 100 ]
WAT?
Until Java 8...
List<Integer> squaresOfEvens = Lists.newArrayList();
for (Integer number : numbers) {
if (number % 2 == 0) {
squaresOfEvens.add(number * number);
}
}
// [ 4, 16, 36, 64, 100 ]
"Excessive use of Guava's functional programming idioms
can lead to verbose, confusing, unreadable, and inefficient
code.These are by far the most easily (and most
commonly) abused parts of Guava, and when you go to
preposterous lengths to make your code "a one-liner," the
Guava team weeps."
ListenableFuture
// setup...
ExecutorService delegate = Executors.newFixedThreadPool(MAX_THREADS);
ListeningExecutorService executorService =
MoreExecutors.listeningDecorator(delegate);
// submit tasks...
ListenableFuture<WorkResult> future = executorService.submit(worker);
Futures.addCallback(future, new FutureCallback<WorkResult>() {
@Override
public void onSuccess(WorkResult result) {
// do something after success...
}
@Override
public void onFailure(Throwable t) {
// handle error...
}
}, executorService););
@Beta
"...subject to change..."
"Guava deprecates, and yes, deletes
unwanted features over time. It is
important to us that when you see a
feature in the Javadocs, it represents
the Guava team's best work, and not
a feature that in retrospect was a bad
idea."
Get some
Guava!
References
https://code.google.com/p/guava-libraries/
https://code.google.com/p/guava-libraries/wiki/GuavaExplained
https://code.google.com/p/guava-libraries/downloads/list
http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/
index.html
http://www.tfnico.com/presentations/google-guava
http://codingjunkie.net/tag/guava/
Photo Attributions
* this one is iStockPhoto (paid) -->
http://www.morguefile.com/archive/display/138854
http://www.flickr.com/photos/hermansaksono/4297175782/
http://commons.wikimedia.org/wiki/File:Guava_ID.jpg
http://www.flickr.com/photos/88845568@N00/2076930689/
http://www.flickr.com/photos/mohannad_khatib/6352720649/
https://github.com/sleberknight/google-guava-samples
Sample code
available at:
My Info
scott dot leberknight at nearinfinity dot com
twitter.com/sleberknight www.sleberknight.com/blog
www.nearinfinity.com/blogs/scott_leberknight/all/
scott dot leberknight at gmail dot com