#1. You can use Optional instead of simply returning null in some specific cases:
Insted of:
/**
* Can return null in specific cases... but it's
* hard to remember
*/
public static String someMethod() {
String returnValue = null;
if (new Date().getTime() % 2 == 0) {
returnValue = "time % 2 == 0";
}
return returnValue;
}
public static void main(String[] args) {
String str = someMethod();
str.contains("%") // will crash
}
use this:
/**
* Explicite shows, that method can
* return empty (null) value
*/
public static Optional< String > someMethod() {
Optional< String > returnValue = Optional.absent();
if (new Date().getTime() % 2 == 0) {
returnValue = Optional.of(new String());
}
return returnValue;
}
public static void main(String[] args) {
Optional< String > str = someMethod();
if(str.isPresent()) {
// here you know that value is not null
}
// or you can operate on given value or a default one
str.or("default value").contains("%");
}
#2 You can use firstNonNull from Guavas Objects class insted of write "if else"
Insted of:
public T foo() {
...
...
if(first != null) {
return first;
} else {
return second;
}
}
use this:
import static com.google.common.base.Objects.firstNonNull;
...
public T foo() {
...
...
return firstNonNull(first, second);
}
#3 You can use Guava Strings class methods to deal with null or empty Strings
Insted of:
if(str == null) {
str = "";
}
if("".equals(str)) {
str = null;
}
if(str == null || str.length() == 0) {
// is null or empty
}
use this:
import static com.google.common.base.Strings.*;
str = nullToEmpty(str);
str = emptyToNull(str);
if(isNullOrEmpty(str)) {
// is null or empty
}
#4 You can use Object.equals(a, b) to check equality safely
Insted of:a.equals(b); // will crash if a is nulluse this:
import static com.google.common.base.Objects.equal; ... equal(a, null); // return false equal(null, null); // return true equal(a, b); // return true if a is equal b
#5 You can use Joiner to join Strings
Insted of:
StringBuffer buffer = new StringBuffer();
for (String str : strs) {
if (str != null) {
buffer.append(str);
buffer.append(", ");
}
}
if (buffer.length() >= 2) {
buffer.substring(0, buffer.length() - 2);
}
return buffer.toString();
use this:
import com.google.common.base.Joiner;
...
return Joiner.on(", ").skipNulls().join(strs);
#6 You can use Splitter to split String
Insted of:
String str = "abc, bcd,, cde ,zsa";
String[] split = str.split(",");
// What with trimming? Whitespaces? Empty strings???
use this:
import com.google.common.base.Splitter;
...
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split("abc, bcd,, cde ,zsa");
#7 You can use Multiset to count object occurences
Insted of:
Map< String, Integer > countMap = new HashMap< String, Integer >();
for (String word : words) {
if(!countMap.containsKey(word)) {
countMap.put(word, 0);
}
countMap.put(word, countMap.get(word) + 1);
}
use this:
import com.google.common.collect.HashMultiset; import com.google.common.collect.Multiset; ... Multiset< String > wordsMultiset = HashMultiset.create(); wordsMultiset.addAll(words);
#8 You can use Multimap insted of map with List or Set as values
Insted of:
Map< String, List< String > > languagesMap = new HashMap< String, List< String >>();
for (Programmer programmer : programmers) {
if (languagesMap.get(programmer.getLanguage()) != null) {
languagesMap.put(programmer.getLanguage(), new ArrayList< String >());
}
languagesMap.get(programmer.getLanguage()).add(programmer.getEmail());
}
use this:
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
...
Multimap< String, String > languagesMap = HashMultimap.create();
for (Programmer programmer : programmers) {
languagesMap.put(programmer.getLanguage(), programmer.getEmail());
}
...next simple, but usable examples soon...