216
Google Guava Core libraries for Java & Android @jordi9 11 / oct / 2013

Google Guava - Core libraries for Java & Android

Embed Size (px)

DESCRIPTION

Talk at GDG DevFest Barcelona 2013. The Guava project contains several of Google's core libraries that we rely on in our Java-based projects: collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, and so forth.

Citation preview

Page 1: Google Guava - Core libraries for Java & Android

Google GuavaCore libraries for Java & Android

@jordi911 / oct / 2013

Page 2: Google Guava - Core libraries for Java & Android

...shameless self-promotion bro!

Page 3: Google Guava - Core libraries for Java & Android

Write less code

Page 4: Google Guava - Core libraries for Java & Android

Write cleaner code

Page 5: Google Guava - Core libraries for Java & Android

Write more readable code

Page 6: Google Guava - Core libraries for Java & Android

The “wheel”

Page 7: Google Guava - Core libraries for Java & Android

com.google.guava:guava:15.0

Page 8: Google Guava - Core libraries for Java & Android

Basics

Page 9: Google Guava - Core libraries for Java & Android

Basics

Avoid using null

Page 10: Google Guava - Core libraries for Java & Android

Basics: Avoid using null

“Null sucks”

Doug Lea - JCP, OpenJDK

Page 11: Google Guava - Core libraries for Java & Android

Basics: Avoid using null

“I call it my billion-dollar mistake”

Sir C.A.R. Hoare - Inventor of null

Page 12: Google Guava - Core libraries for Java & Android

Basics: Avoid using null

@Google95% of collections weren’t supposed to have null values.

Page 13: Google Guava - Core libraries for Java & Android

map = {Foo: bar, null, Baz: qux}

Basics: Avoid using null

Page 14: Google Guava - Core libraries for Java & Android

map = {Foo: bar, null, Baz: qux}

map.get(“Foo”);

Basics: Avoid using null

Page 15: Google Guava - Core libraries for Java & Android

map = {Foo: bar, null, Baz: qux}

map.get(“Foo”); // returns Foo

Basics: Avoid using null

Page 16: Google Guava - Core libraries for Java & Android

map = {Foo: bar, null, Baz: qux}

map.get(“Foo”);

map.get(“quux”);

Basics: Avoid using null

Page 17: Google Guava - Core libraries for Java & Android

map = {Foo: bar, null, Baz: qux}

map.get(“Foo”);

map.get(“quux”); // returns null

Basics: Avoid using null

Page 18: Google Guava - Core libraries for Java & Android

map = {Foo: bar, null, Baz: qux}

map.get(“Foo”);

map.get(“quux”);

map.get(null);

Basics: Avoid using null

Page 19: Google Guava - Core libraries for Java & Android

map = {Foo: bar, null, Baz: qux}

map.get(“Foo”);

map.get(“quux”);

map.get(null); // returns null

Basics: Avoid using null

Page 20: Google Guava - Core libraries for Java & Android

map = {Foo: bar, null, Baz: qux}

map.get(“Foo”);

map.get(“quux”); // returns null

map.get(null); // returns null

Basics: Avoid using null

Page 21: Google Guava - Core libraries for Java & Android

map = {Foo: bar, null, Baz: qux}

map.get(“Foo”);

map.get(“quux”); // returns null

map.get(null); // returns null

// Null to indicate absence

// vs null value

Basics: Avoid using null

Page 22: Google Guava - Core libraries for Java & Android

Optional<T>

Basics: Avoid using null

Page 23: Google Guava - Core libraries for Java & Android

Optional<T>

Optional<String> foo = Optional.of(“foo”)

Basics: Avoid using null

Page 24: Google Guava - Core libraries for Java & Android

Optional<T>

Optional<String> foo = Optional.of(“foo”)

foo.isPresent(); // returns true

Basics: Avoid using null

Page 25: Google Guava - Core libraries for Java & Android

Optional<T>

Optional<String> foo = Optional.of(“foo”)

foo.isPresent();

foo.get(); // returns “foo”

Basics: Avoid using null

Page 26: Google Guava - Core libraries for Java & Android

Optional.of(foo); // not nullable

Goodies!

RTFM, I mean javadoc

Page 28: Google Guava - Core libraries for Java & Android

Optional.of(foo);

Optional.absent();

Optional.fromNullable(legacyCode);

Goodies!

javadoc

Page 29: Google Guava - Core libraries for Java & Android

Optional.of(foo);

Optional.absent();

Optional.fromNullable(legacyCode);

foo.get(); // may return “foo”

Goodies!

javadoc

Page 30: Google Guava - Core libraries for Java & Android

Optional.of(foo);

Optional.absent();

Optional.fromNullable(legacyCode);

foo.get();

foo.or(“bar”); // return “bar” if foo is absent

Goodies!

javadoc

Page 31: Google Guava - Core libraries for Java & Android

Optional.of(foo);

Optional.absent();

Optional.fromNullable(legacyCode);

foo.get();

foo.or(“bar”);

foo.orNull(); // Deal with code that need nulls, duh

Goodies!

javadoc

Page 32: Google Guava - Core libraries for Java & Android

Optional<T> is IDIOT-PROOF-NESS

Bottom line

Page 33: Google Guava - Core libraries for Java & Android

Basics

Preconditions

Page 34: Google Guava - Core libraries for Java & Android

if (seats <= 0) {

throw new IllegalArgumentException(“Seats must be

positive, but was ” + seats);

}

Basics: Preconditions

Page 35: Google Guava - Core libraries for Java & Android

if (seats <= 0) {

throw new IllegalArgumentException(“Seats must be

positive, but was ” + seats);

}

checkArgument(seats > 0, “Seats must be positive,

but was %s”, seats);

Basics: Preconditions

Page 36: Google Guava - Core libraries for Java & Android

// Always use static importimport static com.google.common.base.Preconditions.checkArgument;

checkArgument(seats > 0, “Seats must be positive,

but was %s”, seats);

Basics: Preconditions

Page 37: Google Guava - Core libraries for Java & Android

import static com.google.common.base.Preconditions.checkArgument;

// Check what you expect to be true

checkArgument(seats > 0, “Seats must be positive,

but was %s”, seats);

Basics: Preconditions

Page 38: Google Guava - Core libraries for Java & Android

import static com.google.common.base.Preconditions.checkArgument;

// “%s” specifier is recognized as a placeholder in // these messages (the only one)

checkArgument(seats > 0, “Seats must be positive,

but was %s”, seats);

Basics: Preconditions

Page 39: Google Guava - Core libraries for Java & Android

void execute(Job job) {

// serious business

}

Basics: Preconditions

Page 40: Google Guava - Core libraries for Java & Android

void execute(Job job) {

checkNotNull(job, “Job can’t be null”);

// serious business

}

// checkNotNull() throws NullPointerException

Basics: Preconditions

Page 41: Google Guava - Core libraries for Java & Android

void execute(Job job) {

checkNotNull(job, “Job can’t be null”);

checkArgument(!job.started(), “Job already started”);

// serious business

}

// checkArgument() throws IllegalArgumentException

// checkNotNull() throws NullPointerException

Basics: Preconditions

Page 42: Google Guava - Core libraries for Java & Android

void execute(Job job) {

checkNotNull(job, “Job can’t be null”);

checkArgument(!job.started(), “Job already started”);

// serious business

checkState(seatsAvailabe <= totalSeats, “You’ve sold

more seats than available! This should never

happen. %s/%s”, seatsAvailable, totalSeats);

}

// checkState() throws IllegalStateException

// checkArgument() throws IllegalArgumentException

// checkNotNull() throws NullPointerException

Basics: Preconditions

Page 44: Google Guava - Core libraries for Java & Android

this.foo = checkNotNull(foo);

// list, string or array checks

checkElementIndex(index, size);

checkPositionIndex(index, size);

checkPositionIndexes(start, end, size);

Goodies!

javadoc

Page 45: Google Guava - Core libraries for Java & Android

Preconditions will save your ass

Bottom line

Page 46: Google Guava - Core libraries for Java & Android

Basics

Objects

Page 47: Google Guava - Core libraries for Java & Android

@Override

public boolean equals(Object obj) {

if (obj == this) {

return true;

}

if (obj == null || obj.getClass() != this.getClass()) {

return false;

}

Person guest = (Person) obj;

return id == guest.id

&& (firstName == guest.firstName || (firstName != null &&

firstName.equals(guest.getFirstName())))

&& (lastName == guest.lastName || (lastName != null &&

lastName.equals(guest.getLastName())));

}

Basics: Objects

Page 48: Google Guava - Core libraries for Java & Android

@Override

public boolean equals(Object obj) {

if (obj == this) {

return true;

}

if (obj == null || obj.getClass() != this.getClass()) {

return false;

}

Person guest = (Person) obj;

return id == guest.id

&& (firstName == guest.firstName || (firstName != null &&

firstName.equals(guest.getFirstName())))

&& (lastName == guest.lastName || (lastName != null &&

lastName.equals(guest.getLastName())));

}

Basics: Objects

F

Page 49: Google Guava - Core libraries for Java & Android

@Override

public boolean equals(Object obj) {

if (obj == this) {

return true;

}

if (obj == null || obj.getClass() != this.getClass()) {

return false;

}

Person guest = (Person) obj;

return id == guest.id

&& (firstName == guest.firstName || (firstName != null &&

firstName.equals(guest.getFirstName())))

&& (lastName == guest.lastName || (lastName != null &&

lastName.equals(guest.getLastName())));

}

Basics: Objects

FM

Page 50: Google Guava - Core libraries for Java & Android

@Override

public boolean equals(Object obj) {

if (obj == this) {

return true;

}

if (obj == null || obj.getClass() != this.getClass()) {

return false;

}

Person guest = (Person) obj;

return id == guest.id

&& (firstName == guest.firstName || (firstName != null &&

firstName.equals(guest.getFirstName())))

&& (lastName == guest.lastName || (lastName != null &&

lastName.equals(guest.getLastName())));

}

Basics: Objects

FML

Page 51: Google Guava - Core libraries for Java & Android

@Override

public boolean equals(Object obj) {

if (obj instanceof Person) {

Person that = (Person) obj;

return Objects.equal(firstName, that.firstName)

&& Objects.equal(lastName, that.lastName);

} else {

return false;

}

}

Basics: Objects

Page 52: Google Guava - Core libraries for Java & Android

@Override

public boolean equals(Object obj) {

if (obj instanceof Person) {

Person that = (Person) obj;

return Objects.equal(firstName, that.firstName) // null safe!

&& Objects.equal(lastName, that.lastName); // null safe x2!

} else {

return false;

}

}

Basics: Objects

Page 53: Google Guava - Core libraries for Java & Android

@Override

public boolean equals(Object obj) {

if (obj instanceof Person) {

Person that = (Person) obj;

return Objects.equal(firstName, that.firstName)

&& Objects.equal(lastName, that.lastName);

} else {

return false;

}

}

// JDK 1.7 introduced equivalent Objects.equals() method.

Basics: Objects

Page 54: Google Guava - Core libraries for Java & Android

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result

+ ((firstName == null) ? 0 : firstName.hashCode());

result = prime * result + id;

result = prime * result

+ ((lastName == null) ? 0 : lastName.hashCode());

return result;

}

Basics: Objects

Page 55: Google Guava - Core libraries for Java & Android

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result

+ ((firstName == null) ? 0 : firstName.hashCode());

result = prime * result + id;

result = prime * result

+ ((lastName == null) ? 0 : lastName.hashCode());

return result;

}

// oh, grumpy cat!

Basics: Objects

Page 56: Google Guava - Core libraries for Java & Android

@Override

public int hashCode() {

return Objects.hashCode(firstName, lastName);

}

Basics: Objects

Page 57: Google Guava - Core libraries for Java & Android

@Override

public int hashCode() {

// sensible, order-sensitive hash

return Objects.hashCode(firstName, lastName);

}

Basics: Objects

Page 58: Google Guava - Core libraries for Java & Android

@Override

public int hashCode() {

return Objects.hashCode(firstName, lastName);

}

// JDK 1.7 introduced equivalent Objects.hash() method.

Basics: Objects

Page 59: Google Guava - Core libraries for Java & Android

@Override

public String toString() {

}

Basics: Objects

Page 60: Google Guava - Core libraries for Java & Android

@Override

public String toString() {

}

Basics: Objects

Page 61: Google Guava - Core libraries for Java & Android

@Override

public String toString() {

return Objects.toStringHelper(this)

.add("firstName", firstName)

.add("lastName", lastName)

.add("catName", catName)

.toString();

}

Basics: Objects

Page 62: Google Guava - Core libraries for Java & Android

@Override

public String toString() {

return Objects.toStringHelper(this)

.add("firstName", firstName)

.add("lastName", lastName)

.add("catName", catName)

.toString();

}

// returns Person{firstName=Solid, lastName=Snake, catName=null}

Basics: Objects

Page 63: Google Guava - Core libraries for Java & Android

@Override

public String toString() {

return Objects.toStringHelper(this)

.add("firstName", firstName)

.add("lastName", lastName)

.add("catName", catName)

.omitNullValues()

.toString();

}

Basics: Objects

Page 64: Google Guava - Core libraries for Java & Android

@Override

public String toString() {

return Objects.toStringHelper(this)

.add("firstName", firstName)

.add("lastName", lastName)

.add("catName", catName)

.omitNullValues()

.toString();

}

// returns Person{firstName=Solid, lastName=Snake}

Basics: Objects

Page 65: Google Guava - Core libraries for Java & Android

IntelliJ IDEA support for ToStringHelper() Generate toString() > Template Objects.ToStringHelper (Guava)

Goodies!

javadoc

Page 66: Google Guava - Core libraries for Java & Android

So common stuff should ring a bell

Bottom line

Page 67: Google Guava - Core libraries for Java & Android

Basics

Ordering

Page 68: Google Guava - Core libraries for Java & Android

Comparator<Person> byDescAgeName = new Comparator<Person>() {

public int compare(Person p1, Person p2) {

int result = p2.getAge() - p1.getAge(); // ugh!

return (result == 0) ?

p1.compareTo(p2) : result;

}

};

// Ok, it’s not that bad -- But it’s pretty hard to get

Basics: Ordering

Page 69: Google Guava - Core libraries for Java & Android

Comparator<Person> byDescAgeName = new Comparator<Person>() {

public int compare(Person p1, Person p2) {

int result = p2.getAge() - p1.getAge(); // ugh!

return (result == 0) ?

p1.compareTo(p2) : result;

}

};

// Ok, it’s not that bad -- But it’s pretty hard to get

// We’re lucky ints and Person are Comparable, otherwise you’ll

// have to implement it

Basics: Ordering

Page 70: Google Guava - Core libraries for Java & Android

Comparator<Person> byDescAgeName = new Comparator<Person>() {

public int compare(Person p1, Person p2) {

return ComparisonChain.start()

.compare(p2.getAge(), p1.getAge())

.compare(p1, p2)

.result();

}

};

Basics: Ordering

Page 71: Google Guava - Core libraries for Java & Android

Comparator<Person> byDescAgeName = new Comparator<Person>() {

public int compare(Person p1, Person p2) {

return ComparisonChain.start()

.compare(p2.getAge(), p1.getAge())

.compare(p1, p2)

.result();

}

};

// Short-circuits: If one comparison is not equals, stop and return

Basics: Ordering

Page 72: Google Guava - Core libraries for Java & Android

Comparator<Person> byDescAgeName =

Ordering.natural()

.reverse()

.onResultOf(new Function<Person, Integer>() {

public Integer apply(Person person) {

return person.getAge();

}})

.compound(Ordering.natural());

}

};

Basics: Ordering

Page 73: Google Guava - Core libraries for Java & Android

Comparator<Person> byDescAgeName =

Ordering.natural()

.reverse()

.onResultOf(new Function<Person, Integer>() {

public Integer apply(Person person) {

return person.getAge();

}})

.compound(Ordering.natural());

}

};

// Read backwards

Basics: Ordering

Page 74: Google Guava - Core libraries for Java & Android

Ordering is an “enriched” Comparator. It’s fuuuuuuuun!

Goodies!

javadoc

Page 75: Google Guava - Core libraries for Java & Android

Ordering is an “enriched” Comparator. It’s fluent.

Goodies!

javadoc

Page 76: Google Guava - Core libraries for Java & Android

Ordering is an “enriched” Comparator. It’s fluent.

// Subclass Ordering and implement compare(T,T)

Ordering<Throwable> ORDER_BY_CLASS_NAME = (left, right) -> {

return Ordering.usingToString()

.compare(left.getClass(), right.getClass());

};

Goodies!

javadoc

Page 77: Google Guava - Core libraries for Java & Android

Ordering is an “enriched” Comparator. It’s fluent.

// Subclass Ordering and implement compare(T,T)

Ordering<Throwable> ORDER_BY_CLASS_NAME = (left, right) -> {

return Ordering.usingToString()

.compare(left.getClass(), right.getClass());

};

// Or create one

Ordering.from(comparator);

Ordering.natural();

Goodies!

javadoc

Page 78: Google Guava - Core libraries for Java & Android

Ordering is an “enriched” Comparator. It’s fluent.

// Subclass Ordering and implement compare(T,T)

Ordering<Throwable> ORDER_BY_CLASS_NAME = (left, right) -> {

return Ordering.usingToString()

.compare(left.getClass(), right.getClass());

};

// Or create one

Ordering.from(comparator);

Ordering.natural();

// And chain!

ORDER_BY_CLASS_NAME.nullsFirst().reverse().compound(comparator);

Goodies!

javadoc

Page 79: Google Guava - Core libraries for Java & Android

There’s a better way than Comparator

Bottom line

Page 80: Google Guava - Core libraries for Java & Android

Basics

Throwables

Page 81: Google Guava - Core libraries for Java & Android

void oneLineOfCode() {

DatagramPacket packet = new DatagramPacket(data, length);

}

Basics: Throwables

Page 82: Google Guava - Core libraries for Java & Android

void oneLineOfCode() {

DatagramPacket packet = new DatagramPacket(data, length);

}

// Compile error, throws IOException

Basics: Throwables

Page 83: Google Guava - Core libraries for Java & Android

void oneLineOfCode() throws IOException {

DatagramPacket packet = new DatagramPacket(data, length);

}

void someLayer() {

oneLineOfCode();

}

Basics: Throwables

Page 84: Google Guava - Core libraries for Java & Android

void oneLineOfCode() throws IOException {

DatagramPacket packet = new DatagramPacket(data, length);

}

void someLayer() {

oneLineOfCode();

}

// Compile error, throws IOException

Basics: Throwables

Page 85: Google Guava - Core libraries for Java & Android

void oneLineOfCode() throws IOException {

DatagramPacket packet = new DatagramPacket(data, length);

}

void someLayer() throws IOException {

oneLineOfCode();

}

void someCoolAbstraction() {

someLayer();

}

Basics: Throwables

Page 86: Google Guava - Core libraries for Java & Android

void oneLineOfCode() throws IOException {

DatagramPacket packet = new DatagramPacket(data, length);

}

void someLayer() throws IOException {

oneLineOfCode();

}

void someCoolAbstraction() {

someLayer();

}

// Compile error, AGAIN

Basics: Throwables

Page 87: Google Guava - Core libraries for Java & Android

void oneLineOfCode() throws IOException {

DatagramPacket packet = new DatagramPacket(data, length);

}

void someLayer() throws IOException {

oneLineOfCode();

}

void someCoolAbstraction() throws IOException {

someLayer();

}

Basics: Throwables

Page 88: Google Guava - Core libraries for Java & Android

void oneLineOfCode() throws IOException {

DatagramPacket packet = new DatagramPacket(data, address);

}

void someLayer() throws IOException {

oneLineOfCode();

}

void someCoolAbstraction() throws IOException {

someLayer();

}

// c’mon...

Basics: Throwables

Page 89: Google Guava - Core libraries for Java & Android

void oneLineOfCode() {

// Take 2

DatagramPacket packet = new DatagramPacket(data, length);

}

Basics: Throwables

Page 90: Google Guava - Core libraries for Java & Android

void oneLineOfCode() {

try {

DatagramPacket packet = new DatagramPacket(data, length);

} catch (IOException e) {

}

}

Basics: Throwables

Page 91: Google Guava - Core libraries for Java & Android

void oneLineOfCode() {

try {

DatagramPacket packet = new DatagramPacket(data, length);

} catch (IOException e) {

// Really? Swallow? Sure? At least explain why!

}

}

Basics: Throwables

Page 92: Google Guava - Core libraries for Java & Android

void oneLineOfCode() {

try {

DatagramPacket packet = new DatagramPacket(data, length);

} catch (IOException e) {

SendMeAnEmail.error();

}

}

Basics: Throwables

Page 93: Google Guava - Core libraries for Java & Android

void oneLineOfCode() {

try {

DatagramPacket packet = new DatagramPacket(data, length);

} catch (IOException e) {

SendMeAnEmail.error();

Oh.theLogger().fatal(“WHY Y U FATAL NOW?”);

}

}

Basics: Throwables

Page 94: Google Guava - Core libraries for Java & Android

void oneLineOfCode() {

try {

DatagramPacket packet = new DatagramPacket(data, length);

} catch (IOException e) {

SendMeAnEmail.error();

Oh.theLogger().fatal(“WHY Y U FATAL NOW?”);

// repeat for every catch block

}

}

Basics: Throwables

Page 95: Google Guava - Core libraries for Java & Android

void oneLineOfCode() {

try {

DatagramPacket packet = new DatagramPacket(data, length);

} catch (IOException e) {

SendMeAnEmail.error();

Oh.theLogger().fatal(“WHY Y U FATAL NOW?”);

// repeat for every catch block

// AGAIN AND AGAIN

}

}

Basics: Throwables

Page 96: Google Guava - Core libraries for Java & Android

void oneLineOfCode() {

try {

DatagramPacket packet = new DatagramPacket(data, address);

} catch (IOException e) {

SendMeAnEmail.error();

Oh.theLogger().fatal(“WHY Y U FATAL NOW?”);

// repeat for every catch block

// AGAIN AND AGAIN

}

}

Basics: Throwables

Page 97: Google Guava - Core libraries for Java & Android

void oneLineOfCode() {

// Take 3

DatagramPacket packet = new DatagramPacket(data, length);

}

Basics: Throwables

Page 98: Google Guava - Core libraries for Java & Android

void oneLineOfCode() {

try {

DatagramPacket packet = new DatagramPacket(data, length);

} catch (IOException e) {

handle(e);

}

}

// We know what to do with this Exception, like recover

Basics: Throwables

Page 99: Google Guava - Core libraries for Java & Android

void oneLineOfCode() {

try {

DatagramPacket packet = new DatagramPacket(data, length);

} catch (IOException e) {

throw new MyException(e);

}

}

// Translate the Exception to another one more suitable

Basics: Throwables

Page 100: Google Guava - Core libraries for Java & Android

void oneLineOfCode() {

try {

DatagramPacket packet = new DatagramPacket(data, length);

} catch (IOException e) {

throw Throwables.propagate(e);

}

}

// Propagates the throwable as-is if it is a RuntimeException or

// an Error, or wraps it in a RuntimeException and throws it

// otherwise.

Basics: Throwables

Page 101: Google Guava - Core libraries for Java & Android

// more forms

propagateIfInstanceOf(throwable,exceptionClass);

Goodies… or gotcha’s!

javadoc

Page 102: Google Guava - Core libraries for Java & Android

// more forms

propagateIfInstanceOf(throwable,exceptionClass);

propagateIfPossible(throwable); // Only if RuntimeException or Error

Goodies… or gotcha’s!

javadoc

Page 103: Google Guava - Core libraries for Java & Android

// more forms

propagateIfInstanceOf(throwable,exceptionClass);

propagateIfPossible(throwable);

propagateIfPossible(throwable, exceptionClass);

Goodies… or gotcha’s!

javadoc

Page 104: Google Guava - Core libraries for Java & Android

// more forms

propagateIfInstanceOf(throwable,exceptionClass);

propagateIfPossible(throwable);

propagateIfPossible(throwable, exceptionClass);

General practice: Convert checked exceptions to unchecked exceptions

Goodies… or gotcha’s!

javadoc

Page 105: Google Guava - Core libraries for Java & Android

// more forms

propagateIfInstanceOf(throwable,exceptionClass);

propagateIfPossible(throwable);

propagateIfPossible(throwable, exceptionClass);

General practice: Convert checked exceptions to unchecked exceptions Checked exceptions... are a bad idea?

Goodies… or gotcha’s!

javadoc

Page 106: Google Guava - Core libraries for Java & Android

// more forms

propagateIfInstanceOf(throwable,exceptionClass);

propagateIfPossible(throwable);

propagateIfPossible(throwable, exceptionClass);

General practice: Convert checked exceptions to unchecked exceptions Checked exceptions... are a bad idea?

Don’t use propagate() to ignore IOExceptions and so on

Goodies… or gotcha’s!

javadoc

Page 107: Google Guava - Core libraries for Java & Android

Think your fraking Exceptions

Bottom line

Page 108: Google Guava - Core libraries for Java & Android

Strings

Page 109: Google Guava - Core libraries for Java & Android

Strings

Splitter

Page 110: Google Guava - Core libraries for Java & Android

We have String.split bro!

Strings: Splitter

Page 111: Google Guava - Core libraries for Java & Android

We have String.split bro!

“,f,,o, o,”.split(“,”) returns:

Strings: Splitter

Page 112: Google Guava - Core libraries for Java & Android

We have String.split bro!

“,f,,o, o,”.split(“,”) returns:

a. [“”, “f”, “”, “o”, “ o”,””]

Strings: Splitter

Page 113: Google Guava - Core libraries for Java & Android

We have String.split bro!

“,f,,o, o,”.split(“,”) returns:

a. [“”, “f”, “”, “o”, “ o”,””]

b. [null, “f”, null, “o” ,”o”, null]

Strings: Splitter

Page 114: Google Guava - Core libraries for Java & Android

We have String.split bro!

“,f,,o, o,”.split(“,”) returns:

a. [“”, “f”, “”, “o”, “ o”,””]

b. [null, “f”, null, “o” ,”o”, null]

c. [“f”, null, “o”, “o”]

Strings: Splitter

Page 115: Google Guava - Core libraries for Java & Android

We have String.split bro!

“,f,,o, o,”.split(“,”) returns:

a. [“”, “f”, “”, “o”, “ o”,””]

b. [null, “f”, null, “o” ,”o”, null]

c. [“f”, null, “o”, “o”]

d. [“f”, ”o”, ”o”]

Strings: Splitter

Page 116: Google Guava - Core libraries for Java & Android

We have String.split bro!

“,f,,o, o,”.split(“,”) returns:

a. [“”, “f”, “”, “o”, “ o”,””]

b. [null, “f”, null, “o” ,”o”, null]

c. [“f”, null, “o”, “o”]

d. [“f”, ”o”, ”o”]

e. None of above

Strings: Splitter

Page 117: Google Guava - Core libraries for Java & Android

We have String.split bro!

“,f,,o, o,”.split(“,”) returns:

a. [“”, “f”, “”, “o”, “ o”,””]

b. [null, “f”, null, “o” ,”o”, null]

c. [“f”, null, “o”, “o”]

d. [“f”, ”o”, ”o”]

e. None of above

Strings: Splitter

Page 118: Google Guava - Core libraries for Java & Android

We have String.split bro!

“,f,,o, o,”.split(“,”) returns:

a. [“”, “f”, “”, “o”, “ o”,””]

b. [null, “f”, null, “o” ,”o”, null]

c. [“f”, null, “o”, “o”]

d. [“f”, ”o”, ”o”]

e. None of above

Strings: Splitter

Page 119: Google Guava - Core libraries for Java & Android

We have String.split bro!

“,f,,o, o,”.split(“,”) returns:

a. [“”, “f”, “”, “o”, “ o”,””]

b. [null, “f”, null, “o” ,”o”, null]

c. [“f”, null, “o”, “o”]

d. [“f”, ”o”, ”o”]

e. None of above

Returns: [“”, “f”, “”, “o”, “ o”]

Strings: Splitter

Page 120: Google Guava - Core libraries for Java & Android

We have String.split bro!

“,f,,o, o,”.split(“,”) returns:

a. [“”, “f”, “”, “o”, “ o”,””]

b. [null, “f”, null, “o” ,”o”, null]

c. [“f”, null, “o”, “o”]

d. [“f”, ”o”, ”o”]

e. None of above

Returns: [“”, “f”, “”, “o”, “ o”]Only trailing empty strings are skipped.

Strings: Splitter

Page 121: Google Guava - Core libraries for Java & Android

“,f,,o, o,”.split(“,”) we probably want [“f”,”o”,”o”]

Strings: Splitter

Page 122: Google Guava - Core libraries for Java & Android

“,f,,o, o,”.split(“,”) we probably want [“f”,”o”,”o”]

Splitter.on(‘,’)

.split(“,f,,o, o,”);

Strings: Splitter

Page 123: Google Guava - Core libraries for Java & Android

“,f,,o, o,”.split(“,”) we probably want [“f”,”o”,”o”]

Splitter.on(‘,’)

.split(“,f,,o, o,”);

// returns [“”,”f”,””,”o”,” o”,””]

// Doesn’t discard trailing separators!

Strings: Splitter

Page 124: Google Guava - Core libraries for Java & Android

“,f,,o, o,”.split(“,”) we probably want [“f”,”o”,”o”]

Splitter.on(‘,’)

.omitEmptyStrings()

.split(“,f,,o, o,”);

Strings: Splitter

Page 125: Google Guava - Core libraries for Java & Android

“,f,,o, o,”.split(“,”) we probably want [“f”,”o”,”o”]

Splitter.on(‘,’)

.omitEmptyStrings()

.split(“,f,,o, o,”);

// returns [”f”,”o”,” o”]

// Empty space is respected

Strings: Splitter

Page 126: Google Guava - Core libraries for Java & Android

“,f,,o, o,”.split(“,”) we probably want [“f”,”o”,”o”]

Splitter.on(‘,’)

.omitEmptyStrings()

.trimResults()

.split(“,f,,o, o,”);

Strings: Splitter

Page 127: Google Guava - Core libraries for Java & Android

“,f,,o, o,”.split(“,”) we probably want [“f”,”o”,”o”]

Splitter.on(‘,’)

.omitEmptyStrings()

.trimResults()

.split(“,f,,o, o,”);

// returns [”f”,”o”,”o”] -- yay!

Strings: Splitter

Page 128: Google Guava - Core libraries for Java & Android

“,f,,o, o,”.split(“,”) we probably want [“f”,”o”,”o”]

static final Splitter COMMA = Splitter.on(‘,’)

.omitEmptyStrings()

.trimResults()

.split(“,f,,o, o,”);

// Best practice: declare Splitters as static final

Strings: Splitter

javadoc

Page 129: Google Guava - Core libraries for Java & Android

Strings

Joiner

Page 130: Google Guava - Core libraries for Java & Android

[“Jack, “Chloe”, “Tony”, null, “Nina”, “Logan”]

Strings: Joiner

Page 131: Google Guava - Core libraries for Java & Android

[“Jack, “Chloe”, “Tony”, null, “Nina”, “Logan”]

Joiner.on(“, “)

.join(twentyFour);

Strings: Joiner

Page 132: Google Guava - Core libraries for Java & Android

[“Jack, “Chloe”, “Tony”, null, “Nina”, “Logan”]

Joiner.on(“, “)

.join(twentyFour);

// throws NullPointerException!

Strings: Joiner

Page 133: Google Guava - Core libraries for Java & Android

[“Jack, “Chloe”, “Tony”, null, “Nina”, “Logan”]

Joiner.on(“, “)

.join(twentyFour);

// throws NullPointerException!

// null-hostile operations everywhere, good thing ;)

Strings: Joiner

Page 134: Google Guava - Core libraries for Java & Android

[“Jack, “Chloe”, “Tony”, null, “Nina”, “Logan”]

Joiner.on(“, “)

.skipNulls();

.join(twentyFour);

// returns “Jack, Chloe, Tony, Nina, Logan”

Strings: Joiner

Page 135: Google Guava - Core libraries for Java & Android

[“Jack, “Chloe”, “Tony”, null, “Nina”, “Logan”]

Joiner.on(“, “)

.useForNull(“Bill”);

.join(twentyFour);

// returns “Jack, Chloe, Tony, Bill, Nina, Logan”

Strings: Joiner

javadoc

Page 136: Google Guava - Core libraries for Java & Android

Always think how to avoid null-idioty

Bottom line

Page 137: Google Guava - Core libraries for Java & Android

Strings

CharMatcher

Page 138: Google Guava - Core libraries for Java & Android

Your StringUtils replacement

Strings: CharMatcher

Page 139: Google Guava - Core libraries for Java & Android

Your StringUtils replacement

CharMatcher.JAVA_ISO_CONTROL.removeFrom(string); // remove control chars

Strings: CharMatcher

Page 140: Google Guava - Core libraries for Java & Android

Your StringUtils replacement

CharMatcher.JAVA_ISO_CONTROL.removeFrom(string);

CharMatcher.DIGIT.retainFrom(“jordi9”); // returns 9

Strings: CharMatcher

Page 141: Google Guava - Core libraries for Java & Android

Your StringUtils replacement

CharMatcher.JAVA_ISO_CONTROL.removeFrom(string);

CharMatcher.DIGIT.retainFrom(“jordi9”);

CharMatcher.DIGIT.removeFrom(“jordi9”); // returns jordi

Strings: CharMatcher

Page 142: Google Guava - Core libraries for Java & Android

Your StringUtils replacement

CharMatcher.JAVA_ISO_CONTROL.removeFrom(string);

CharMatcher.DIGIT.retainFrom(“jordi9”);

CharMatcher.DIGIT.removeFrom(“jordi9”);

CharMatcher.DIGIT.or(CharMatcher.JAVA_UPPER_CASE).retainFrom(“Jordi9”);

// returns J9

Strings: CharMatcher

Page 143: Google Guava - Core libraries for Java & Android

// More matchers

CharMatcher.ANY;

CharMatcher.BREAKING_WHITESPACE;

CharMatcher.WHITESPACE;

CharMatcher.INVISIBLE;

CharMatcher.DIGIT; // Unicode

CharMatcher.JAVA_DIGIT; // Java’s definition

CharMatcher.is(char);

CharMatcher.isNot(char);

Goodies!

javadoc

Page 144: Google Guava - Core libraries for Java & Android

// More matchers

CharMatcher.ANY;

CharMatcher.BREAKING_WHITESPACE;

CharMatcher.WHITESPACE;

CharMatcher.INVISIBLE;

CharMatcher.DIGIT; // Unicode

CharMatcher.JAVA_DIGIT; // Java’s definition

CharMatcher.is(char);

CharMatcher.isNot(char);

// And operations

.replaceFrom(charSequence, replacement);

.collapseFrom(charSequence, replacement);

.trimFrom(charSequence, replacement);

Goodies!

javadoc

Page 145: Google Guava - Core libraries for Java & Android

Strings

Escapers

Page 146: Google Guava - Core libraries for Java & Android

HtmlEscapers.htmlEscaper().escape("Foo > bar");

// returns Foo &gt; bar

Escapers

Page 147: Google Guava - Core libraries for Java & Android

HtmlEscapers.htmlEscaper().escape("Foo > bar");

XmlEscapers.xmlAttributeEscaper().escape("foo \"bar\"");

// returns foo &quot;bar&quot;

Escapers

Page 148: Google Guava - Core libraries for Java & Android

HtmlEscapers.htmlEscaper().escape("Foo > bar");

XmlEscapers.xmlAttributeEscaper().escape("foo \"bar\"");

XmlEscapers.xmlContentEscaper().escape("foo \"bar\"");

// returns foo “bar”

Escapers

Page 149: Google Guava - Core libraries for Java & Android

HtmlEscapers.htmlEscaper().escape("Foo > bar");

XmlEscapers.xmlAttributeEscaper().escape("foo \"bar\"");

XmlEscapers.xmlContentEscaper().escape("foo \"bar\"");

Escaper myEscaper = Escapers.builder() // custom Escaper

.addEscape(‘\’’, “‘’”)

.addEscape(‘&’, “\&”)

.build();

Escapers

javadoc

Page 150: Google Guava - Core libraries for Java & Android

Collections

Page 151: Google Guava - Core libraries for Java & Android

Collections: Functional Idiom

Page 152: Google Guava - Core libraries for Java & Android

Collections: Functional Idiom

Page 153: Google Guava - Core libraries for Java & Android

Collections: Functional Idiom

Page 154: Google Guava - Core libraries for Java & Android

Function<String, Integer> lengthFunction = new Function<String, Integer>() {

public Integer apply(String string) {

return string.length();

}

};

Predicate<String> allCaps = new Predicate<String>() {

public boolean apply(String string) {

return CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string);

}

};

Multiset<Integer> lengths = HashMultiset.create(

Iterables.transform(Iterables.filter(strings, allCaps), lengthFunction));

Collections: Functional Idiom

Page 155: Google Guava - Core libraries for Java & Android

Function<String, Integer> lengthFunction = new Function<String, Integer>() {

public Integer apply(String string) {

return string.length();

}

};

Predicate<String> allCaps = new Predicate<String>() {

public boolean apply(String string) {

return CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string);

}

};

Multiset<Integer> lengths = HashMultiset.create(

Iterables.transform(Iterables.filter(strings, allCaps), lengthFunction));

Collections: Functional Idiom

Page 156: Google Guava - Core libraries for Java & Android

Multiset<Integer> lengths = HashMultiset.create();

for (String string : strings) {

if (CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string)) {

lengths.add(string.length());

}

}

Collections: Functional Idiom

Page 157: Google Guava - Core libraries for Java & Android

Multiset<Integer> lengths = HashMultiset.create();

for (String string : strings) {

if (CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string)) {

lengths.add(string.length());

}

}

// Use Imperative, you’ve already survived!

Collections: Functional Idiom

Page 158: Google Guava - Core libraries for Java & Android

Multiset<Integer> lengths = HashMultiset.create();

for (String string : strings) {

if (CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string)) {

lengths.add(string.length());

}

}

// Use Imperative, you’ve already survived!

// Wait for Java 8!

Collections: Functional Idiom

explain

Page 159: Google Guava - Core libraries for Java & Android

Immutable = Thread-safe

Collections: Immutable types

Page 160: Google Guava - Core libraries for Java & Android

Immutable = Thread-safe

static final ImmutableSet<String> FOO_NAMES =

ImmutableSet.of(“foo”, “bar”, “baz”);

Collections: Immutable types

Page 161: Google Guava - Core libraries for Java & Android

Immutable = Thread-safe

static final ImmutableSet<String> FOO_NAMES =

ImmutableSet.of(“foo”, “bar”, “baz”);

// ImmutableList, ImmutableMap...

Collections: Immutable types

Page 162: Google Guava - Core libraries for Java & Android

Immutable = Thread-safe

static final ImmutableSet<String> FOO_NAMES =

ImmutableSet.of(“foo”, “bar”, “baz”);

ImmutableList<String> defensiveCopy =

ImmutableList.copyOf(someList);

Collections: Immutable types

Page 163: Google Guava - Core libraries for Java & Android

Immutable = Thread-safe

static final ImmutableSet<String> FOO_NAMES =

ImmutableSet.of(“foo”, “bar”, “baz”);

ImmutableList<String> defensiveCopy =

ImmutableList.copyOf(someList);

// Prefer Immutable collections over JDK Collections.unmodifiableXX

// for efficiency and consistency

Collections: Immutable types

explain

Page 164: Google Guava - Core libraries for Java & Android

A bag

Collections: Multiset<E>

Page 165: Google Guava - Core libraries for Java & Android

A bagJust like a Set<E> with repeated values

Collections: Multiset<E>

Page 166: Google Guava - Core libraries for Java & Android

A bagJust like a Set<E> with repeated valuesYou’ve done this with ArrayList<E> or Map<E, Integer>

Collections: Multiset<E>

Page 167: Google Guava - Core libraries for Java & Android

A bagJust like a Set<E> with repeated valuesYou’ve done this with ArrayList<E> or Map<E, Integer>

Multiset<Person> ppl = HashMultiset.create();

Collections: Multiset<E>

Page 168: Google Guava - Core libraries for Java & Android

A bagJust like a Set<E> with repeated valuesYou’ve done this with ArrayList<E> or Map<E, Integer>

Multiset<Person> ppl = HashMultiset.create();

ppl.add(jack);

ppl.add(charles);

ppl.add(jack);

Collections: Multiset<E>

Page 169: Google Guava - Core libraries for Java & Android

A bagJust like a Set<E> with repeated valuesYou’ve done this with ArrayList<E> or Map<E, Integer>

Multiset<Person> ppl = HashMultiset.create();

ppl.add(jack);

ppl.add(charles);

ppl.add(jack);

// prints [jack x 2, charles x 1]

Collections: Multiset<E>

Page 170: Google Guava - Core libraries for Java & Android

A bagJust like a Set<E> with repeated valuesYou’ve done this with ArrayList<E> or Map<E, Integer>

Multiset<Person> ppl = HashMultiset.create();

ppl.add(jack);

ppl.add(charles);

ppl.add(jack);

ppl.count(jack);

Collections: Multiset<E>

Page 171: Google Guava - Core libraries for Java & Android

A bagJust like a Set<E> with repeated valuesYou’ve done this with ArrayList<E> or Map<E, Integer>

Multiset<Person> ppl = HashMultiset.create();

ppl.add(jack);

ppl.add(charles);

ppl.add(jack);

ppl.count(jack);

// returns 2

Collections: Multiset<E>

Page 172: Google Guava - Core libraries for Java & Android

A bagJust like a Set<E> with repeated valuesYou’ve done this with ArrayList<E> or Map<E, Integer>

Multiset<Person> ppl = HashMultiset.create();

ppl.add(jack);

ppl.add(charles);

ppl.add(jack);

ppl.count(jack);

// Goodies: elementSet(), entrySet(), setCount(E, int)...

Collections: Multiset<E>

explain

Page 173: Google Guava - Core libraries for Java & Android

A Map<K, V> with multiple values

Collections: Multimap<K, V>

Page 174: Google Guava - Core libraries for Java & Android

A Map<K, V> with multiple valuesYou’ve done this with Map<K, List<V>>

Collections: Multimap<K, V>

Page 175: Google Guava - Core libraries for Java & Android

A Map<K, V> with multiple valuesYou’ve done this with Map<K, List<V>>

Multimap<Person, Ticket> ticketsByPerson =

ArrayListMultimap.create();

Collections: Multimap<K, V>

Page 176: Google Guava - Core libraries for Java & Android

A Map<K, V> with multiple valuesYou’ve done this with Map<K, List<V>>

Multimap<Person, Ticket> ticketsByPerson =

ArrayListMultimap.create();

ticketsByPerson.put(jack, ctu);

ticketsByPerson.put(jack, division);

Collections: Multimap<K, V>

Page 177: Google Guava - Core libraries for Java & Android

A Map<K, V> with multiple valuesYou’ve done this with Map<K, List<V>>

Multimap<Person, Ticket> ticketsByPerson =

ArrayListMultimap.create();

ticketsByPerson.put(jack, ctu);

ticketsByPerson.put(jack, division);

ticketsByPerson.get(jack);

// returns a view of the associated values, a List.

// With SetMultimap returns a Set.

Collections: Multimap<K, V>

Page 178: Google Guava - Core libraries for Java & Android

A Map<K, V> with multiple valuesYou’ve done this with Map<K, List<V>>

Multimap<Person, Ticket> ticketsByPerson =

ArrayListMultimap.create();

ticketsByPerson.put(jack, ctu);

ticketsByPerson.put(jack, division);

ticketsByPerson.get(jack);

// asMap(), entries(), values()...

Collections: Multimap<K, V>

explain

Page 179: Google Guava - Core libraries for Java & Android

// Bi-directional map, keys and values are unique

BiMap<K1, K2>

Goodies!

javadoc

Page 180: Google Guava - Core libraries for Java & Android

// Bi-directional map, keys and values are unique

BiMap<K1, K2>

// Two-tier map, or a map with two keys

Table<R, C, V>

Goodies!

javadoc

Page 181: Google Guava - Core libraries for Java & Android

// Bi-directional map, keys and values are unique

BiMap<K1, K2>

// Two-tier map, or a map with two keys

Table<R, C, V>

// < JDK 7, no diamond support

List<String> list = Lists.newArrayList(); // Sets, Maps...

Goodies!

javadoc

Page 182: Google Guava - Core libraries for Java & Android

// Bi-directional map, keys and values are unique

BiMap<K1, K2>

// Two-tier map, or a map with two keys

Table<R, C, V>

// < JDK 7, no diamond support

List<String> list = Lists.newArrayList(); // Sets, Maps...

// Ranges

RangeSet<Integer> rangeSet = TreeRangeSet.create();

rangeSet.add(Range.closed(1, 10)); // {[1, 10]}

Goodies!

javadoc

Page 183: Google Guava - Core libraries for Java & Android

Tons of good abstractions for you to use

Bottom line

Page 184: Google Guava - Core libraries for Java & Android

Hashing

Page 185: Google Guava - Core libraries for Java & Android

Freaking PHP: md5($string)

Hashing: JDK

Page 186: Google Guava - Core libraries for Java & Android

Freaking PHP: md5($string)

public static String md5Java(String message) {

String digest = null;

try {

MessageDigest md = MessageDigest.getInstance("MD5");

byte[] hash = md.digest(message.getBytes("UTF-8"));

String StringBuilder sb = new StringBuilder(2*hash.length);

for(byte b : hash){

sb.append(String.format("%02x", b&0xff));

}

digest = sb.toString();

} catch (UnsupportedEncodingException ex) {

throw Throwables.propagate(ex);

} catch (NoSuchAlgorithmException ex) {

throw Throwables.propagate(ex);

}

return digest;

}

Hashing: JDK

Page 187: Google Guava - Core libraries for Java & Android

Freaking PHP: md5($string)

public static String md5Java(String message) {

String digest = null;

try {

MessageDigest md = MessageDigest.getInstance("MD5");

byte[] hash = md.digest(message.getBytes("UTF-8"));

String StringBuilder sb = new StringBuilder(2*hash.length);

for(byte b : hash){

sb.append(String.format("%02x", b&0xff));

}

digest = sb.toString();

} catch (UnsupportedEncodingException ex) {

throw Throwables.propagate(ex);

} catch (NoSuchAlgorithmException ex) {

throw Throwables.propagate(ex);

}

return digest;

}

Hashing: JDK

Page 188: Google Guava - Core libraries for Java & Android

HashFunction hf = Hashing.md5();

Hashing: Hasher

Page 189: Google Guava - Core libraries for Java & Android

HashFunction hf = Hashing.md5();

HashCode hc = hf.newHasher()

.putLong(id)

.putString(name, Charsets.UTF_8)

.putObject(person, personFunnel)

.hash();

Hashing: Hasher

Page 190: Google Guava - Core libraries for Java & Android

HashFunction hf = Hashing.md5();

HashCode hc = hf.newHasher()

.putLong(id)

.putString(name, Charsets.UTF_8)

.putObject(person, personFunnel) // Defines how to hash

.hash();

Hashing: Hasher

Page 191: Google Guava - Core libraries for Java & Android

HashFunction hf = Hashing.md5();

HashCode hc = hf.newHasher()

.putLong(id)

.putString(name, Charsets.UTF_8) // HINT: remember this!

.putObject(person, personFunnel)

.hash();

Hashing: Hasher

Page 192: Google Guava - Core libraries for Java & Android

HashFunction hf = Hashing.md5();

HashCode hc = hf.newHasher()

.putLong(id)

.putString(name, Charsets.UTF_8)

.putObject(person, personFunnel)

.hash();

hc.asBytes(); // byte[]

hc.asInt(); // value in little-endian order

hc.toString(); // hexadecimal in lower case

Hashing: Hasher

Page 193: Google Guava - Core libraries for Java & Android

// More hash functions!

Hashing.md5();

Hashing.murmur3_32();

Hashing.murmur3_128();

Hashing.sha1();

Hashing.sha256();

Hashing.sha512();

Goodies!

javadoc

Page 194: Google Guava - Core libraries for Java & Android

// More hash functions!

Hashing.md5();

Hashing.murmur3_32();

Hashing.murmur3_128();

Hashing.sha1();

Hashing.sha256();

Hashing.sha512();

// Bloom Filter

public boolean mightContain(T);

if true, T is probably there

if false, T for sure is not there

Goodies!

javadoc

Page 195: Google Guava - Core libraries for Java & Android

I/O

Page 196: Google Guava - Core libraries for Java & Android

Binary encoding scheme, RFC 4648

I/O: BaseEncoding

Page 197: Google Guava - Core libraries for Java & Android

Binary encoding scheme, RFC 4648 -- Serious stuff

I/O: BaseEncoding

Page 198: Google Guava - Core libraries for Java & Android

Binary encoding scheme, RFC 4648

BaseEncoding

.base32()

.encode("foo".getBytes(Charsets.US_ASCII));

I/O: BaseEncoding

Page 199: Google Guava - Core libraries for Java & Android

Binary encoding scheme, RFC 4648

BaseEncoding

.base32()

.encode("foo".getBytes(Charsets.US_ASCII));

// returns MZXW6===

I/O: BaseEncoding

Page 200: Google Guava - Core libraries for Java & Android

Binary encoding scheme, RFC 4648

BaseEncoding

.base32()

.encode("foo".getBytes(Charsets.US_ASCII));

// returns MZXW6===

byte[] decoded = BaseEncoding

.base32()

.decode("MZXW6===");

I/O: BaseEncoding

Page 201: Google Guava - Core libraries for Java & Android

Binary encoding scheme, RFC 4648

BaseEncoding

.base32()

.encode("foo".getBytes(Charsets.US_ASCII));

// returns MZXW6===

byte[] decoded = BaseEncoding

.base32()

.decode("MZXW6===");

// returns the ASCII bytes of String “foo”

I/O: BaseEncoding

Page 202: Google Guava - Core libraries for Java & Android

// More schemas

BaseEncoding.base16();

BaseEncoding.base32();

BaseEncoding.base64();

BaseEncoding.base64Url(); // Useful all the time

Goodies!

javadoc

Page 203: Google Guava - Core libraries for Java & Android

KIA

Page 204: Google Guava - Core libraries for Java & Android

KIACaches EventBus

Page 205: Google Guava - Core libraries for Java & Android

KIACachesNetworking

EventBusConcurrency

Page 206: Google Guava - Core libraries for Java & Android

KIACachesNetworkingMath

EventBusConcurrencyMore I/O

Page 207: Google Guava - Core libraries for Java & Android

KIACachesNetworkingMathReflection

EventBusConcurrencyMore I/O Collect

Page 208: Google Guava - Core libraries for Java & Android

KIACachesNetworkingMathReflectionPrimitives

EventBusConcurrencyMore I/O Collect Grumpy

Page 211: Google Guava - Core libraries for Java & Android

Remember

The “wheel”

Page 212: Google Guava - Core libraries for Java & Android

Remember

Read this code

Page 213: Google Guava - Core libraries for Java & Android

Remember

No Grumpy Cats were harmed in the making of

this presentation

Page 214: Google Guava - Core libraries for Java & Android
Page 215: Google Guava - Core libraries for Java & Android

Thanks!

[email protected]@jordi9

Page 216: Google Guava - Core libraries for Java & Android

Q & A

[email protected]@jordi9