google guava - core libraries for java & android
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.TRANSCRIPT
![Page 1: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/1.jpg)
Google GuavaCore libraries for Java & Android
@jordi911 / oct / 2013
![Page 2: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/2.jpg)
...shameless self-promotion bro!
![Page 3: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/3.jpg)
Write less code
![Page 4: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/4.jpg)
Write cleaner code
![Page 5: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/5.jpg)
Write more readable code
![Page 6: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/6.jpg)
The “wheel”
![Page 7: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/7.jpg)
com.google.guava:guava:15.0
![Page 8: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/8.jpg)
Basics
![Page 9: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/9.jpg)
Basics
Avoid using null
![Page 10: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/10.jpg)
Basics: Avoid using null
“Null sucks”
Doug Lea - JCP, OpenJDK
![Page 11: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/11.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/12.jpg)
Basics: Avoid using null
@Google95% of collections weren’t supposed to have null values.
![Page 13: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/13.jpg)
map = {Foo: bar, null, Baz: qux}
Basics: Avoid using null
![Page 14: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/14.jpg)
map = {Foo: bar, null, Baz: qux}
map.get(“Foo”);
Basics: Avoid using null
![Page 15: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/15.jpg)
map = {Foo: bar, null, Baz: qux}
map.get(“Foo”); // returns Foo
Basics: Avoid using null
![Page 16: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/16.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/17.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/18.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/19.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/20.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/21.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/22.jpg)
Optional<T>
Basics: Avoid using null
![Page 23: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/23.jpg)
Optional<T>
Optional<String> foo = Optional.of(“foo”)
Basics: Avoid using null
![Page 24: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/24.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/25.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/26.jpg)
Optional.of(foo); // not nullable
Goodies!
RTFM, I mean javadoc
![Page 27: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/27.jpg)
Optional.of(foo);
Optional.absent();
Goodies!
javadoc
![Page 28: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/28.jpg)
Optional.of(foo);
Optional.absent();
Optional.fromNullable(legacyCode);
Goodies!
javadoc
![Page 29: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/29.jpg)
Optional.of(foo);
Optional.absent();
Optional.fromNullable(legacyCode);
foo.get(); // may return “foo”
Goodies!
javadoc
![Page 30: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/30.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/31.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/32.jpg)
Optional<T> is IDIOT-PROOF-NESS
Bottom line
![Page 33: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/33.jpg)
Basics
Preconditions
![Page 34: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/34.jpg)
if (seats <= 0) {
throw new IllegalArgumentException(“Seats must be
positive, but was ” + seats);
}
Basics: Preconditions
![Page 35: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/35.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/36.jpg)
// 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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/37.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/38.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/39.jpg)
void execute(Job job) {
// serious business
}
Basics: Preconditions
![Page 40: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/40.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/41.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/42.jpg)
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 43: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/43.jpg)
this.foo = checkNotNull(foo); // inline assig
Goodies!
javadoc
![Page 44: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/44.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/45.jpg)
Preconditions will save your ass
Bottom line
![Page 46: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/46.jpg)
Basics
Objects
![Page 47: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/47.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/48.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/49.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/50.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/51.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/52.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/53.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/54.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/55.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/56.jpg)
@Override
public int hashCode() {
return Objects.hashCode(firstName, lastName);
}
Basics: Objects
![Page 57: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/57.jpg)
@Override
public int hashCode() {
// sensible, order-sensitive hash
return Objects.hashCode(firstName, lastName);
}
Basics: Objects
![Page 58: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/58.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/59.jpg)
@Override
public String toString() {
}
Basics: Objects
![Page 60: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/60.jpg)
@Override
public String toString() {
}
Basics: Objects
![Page 61: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/61.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/62.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/63.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/64.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/65.jpg)
IntelliJ IDEA support for ToStringHelper() Generate toString() > Template Objects.ToStringHelper (Guava)
Goodies!
javadoc
![Page 66: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/66.jpg)
So common stuff should ring a bell
Bottom line
![Page 67: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/67.jpg)
Basics
Ordering
![Page 68: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/68.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/69.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/70.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/71.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/72.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/73.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/74.jpg)
Ordering is an “enriched” Comparator. It’s fuuuuuuuun!
Goodies!
javadoc
![Page 75: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/75.jpg)
Ordering is an “enriched” Comparator. It’s fluent.
Goodies!
javadoc
![Page 76: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/76.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/77.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/78.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/79.jpg)
There’s a better way than Comparator
Bottom line
![Page 80: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/80.jpg)
Basics
Throwables
![Page 81: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/81.jpg)
void oneLineOfCode() {
DatagramPacket packet = new DatagramPacket(data, length);
}
Basics: Throwables
![Page 82: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/82.jpg)
void oneLineOfCode() {
DatagramPacket packet = new DatagramPacket(data, length);
}
// Compile error, throws IOException
Basics: Throwables
![Page 83: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/83.jpg)
void oneLineOfCode() throws IOException {
DatagramPacket packet = new DatagramPacket(data, length);
}
void someLayer() {
oneLineOfCode();
}
Basics: Throwables
![Page 84: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/84.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/85.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/86.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/87.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/88.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/89.jpg)
void oneLineOfCode() {
// Take 2
DatagramPacket packet = new DatagramPacket(data, length);
}
Basics: Throwables
![Page 90: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/90.jpg)
void oneLineOfCode() {
try {
DatagramPacket packet = new DatagramPacket(data, length);
} catch (IOException e) {
}
}
Basics: Throwables
![Page 91: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/91.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/92.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/93.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/94.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/95.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/96.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/97.jpg)
void oneLineOfCode() {
// Take 3
DatagramPacket packet = new DatagramPacket(data, length);
}
Basics: Throwables
![Page 98: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/98.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/99.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/100.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/101.jpg)
// more forms
propagateIfInstanceOf(throwable,exceptionClass);
Goodies… or gotcha’s!
javadoc
![Page 102: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/102.jpg)
// 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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/103.jpg)
// more forms
propagateIfInstanceOf(throwable,exceptionClass);
propagateIfPossible(throwable);
propagateIfPossible(throwable, exceptionClass);
Goodies… or gotcha’s!
javadoc
![Page 104: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/104.jpg)
// 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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/105.jpg)
// 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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/106.jpg)
// 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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/107.jpg)
Think your fraking Exceptions
Bottom line
![Page 108: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/108.jpg)
Strings
![Page 109: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/109.jpg)
Strings
Splitter
![Page 110: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/110.jpg)
We have String.split bro!
Strings: Splitter
![Page 111: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/111.jpg)
We have String.split bro!
“,f,,o, o,”.split(“,”) returns:
Strings: Splitter
![Page 112: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/112.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/113.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/114.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/115.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/116.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/117.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/118.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/119.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/120.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/121.jpg)
“,f,,o, o,”.split(“,”) we probably want [“f”,”o”,”o”]
Strings: Splitter
![Page 122: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/122.jpg)
“,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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/123.jpg)
“,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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/124.jpg)
“,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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/125.jpg)
“,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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/126.jpg)
“,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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/127.jpg)
“,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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/128.jpg)
“,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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/129.jpg)
Strings
Joiner
![Page 130: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/130.jpg)
[“Jack, “Chloe”, “Tony”, null, “Nina”, “Logan”]
Strings: Joiner
![Page 131: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/131.jpg)
[“Jack, “Chloe”, “Tony”, null, “Nina”, “Logan”]
Joiner.on(“, “)
.join(twentyFour);
Strings: Joiner
![Page 132: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/132.jpg)
[“Jack, “Chloe”, “Tony”, null, “Nina”, “Logan”]
Joiner.on(“, “)
.join(twentyFour);
// throws NullPointerException!
Strings: Joiner
![Page 133: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/133.jpg)
[“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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/134.jpg)
[“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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/135.jpg)
[“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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/136.jpg)
Always think how to avoid null-idioty
Bottom line
![Page 137: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/137.jpg)
Strings
CharMatcher
![Page 138: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/138.jpg)
Your StringUtils replacement
Strings: CharMatcher
![Page 139: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/139.jpg)
Your StringUtils replacement
CharMatcher.JAVA_ISO_CONTROL.removeFrom(string); // remove control chars
Strings: CharMatcher
![Page 140: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/140.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/141.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/142.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/143.jpg)
// 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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/144.jpg)
// 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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/145.jpg)
Strings
Escapers
![Page 146: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/146.jpg)
HtmlEscapers.htmlEscaper().escape("Foo > bar");
// returns Foo > bar
Escapers
![Page 147: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/147.jpg)
HtmlEscapers.htmlEscaper().escape("Foo > bar");
XmlEscapers.xmlAttributeEscaper().escape("foo \"bar\"");
// returns foo "bar"
Escapers
![Page 148: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/148.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/149.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/150.jpg)
Collections
![Page 151: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/151.jpg)
Collections: Functional Idiom
![Page 152: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/152.jpg)
Collections: Functional Idiom
![Page 153: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/153.jpg)
Collections: Functional Idiom
![Page 154: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/154.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/155.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/156.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/157.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/158.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/159.jpg)
Immutable = Thread-safe
Collections: Immutable types
![Page 160: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/160.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/161.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/162.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/163.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/164.jpg)
A bag
Collections: Multiset<E>
![Page 165: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/165.jpg)
A bagJust like a Set<E> with repeated values
Collections: Multiset<E>
![Page 166: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/166.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/167.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/168.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/169.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/170.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/171.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/172.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/173.jpg)
A Map<K, V> with multiple values
Collections: Multimap<K, V>
![Page 174: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/174.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/175.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/176.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/177.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/178.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/179.jpg)
// Bi-directional map, keys and values are unique
BiMap<K1, K2>
Goodies!
javadoc
![Page 180: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/180.jpg)
// 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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/181.jpg)
// 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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/182.jpg)
// 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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/183.jpg)
Tons of good abstractions for you to use
Bottom line
![Page 184: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/184.jpg)
Hashing
![Page 185: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/185.jpg)
Freaking PHP: md5($string)
Hashing: JDK
![Page 186: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/186.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/187.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/188.jpg)
HashFunction hf = Hashing.md5();
Hashing: Hasher
![Page 189: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/189.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/190.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/191.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/192.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/193.jpg)
// 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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/194.jpg)
// 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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/195.jpg)
I/O
![Page 196: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/196.jpg)
Binary encoding scheme, RFC 4648
I/O: BaseEncoding
![Page 197: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/197.jpg)
Binary encoding scheme, RFC 4648 -- Serious stuff
I/O: BaseEncoding
![Page 198: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/198.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/199.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/200.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/201.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/202.jpg)
// 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](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/203.jpg)
KIA
![Page 204: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/204.jpg)
KIACaches EventBus
![Page 205: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/205.jpg)
KIACachesNetworking
EventBusConcurrency
![Page 206: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/206.jpg)
KIACachesNetworkingMath
EventBusConcurrencyMore I/O
![Page 207: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/207.jpg)
KIACachesNetworkingMathReflection
EventBusConcurrencyMore I/O Collect
![Page 208: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/208.jpg)
KIACachesNetworkingMathReflectionPrimitives
EventBusConcurrencyMore I/O Collect Grumpy
![Page 210: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/210.jpg)
Your friends
Wiki
javadoc
![Page 211: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/211.jpg)
Remember
The “wheel”
![Page 212: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/212.jpg)
Remember
Read this code
![Page 213: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/213.jpg)
Remember
No Grumpy Cats were harmed in the making of
this presentation
![Page 214: Google Guava - Core libraries for Java & Android](https://reader034.vdocuments.net/reader034/viewer/2022042613/540dd9178d7f72767e8b4b78/html5/thumbnails/214.jpg)