Guava系列

1.簡介

這份系列文章按使用Guava樣式集合的小而集中的祕訣和代碼段進行組織。

格式是不斷增長的代碼示例列表,不需要額外的說明,它的目的是使開發過程中易於訪問API的常用用法。

2.祕訣

將List <Parent>下放到List <Child>

注意:這是Java中非協變通用集合的解決方法

class CastFunction<F, T extends F> implements Function<F, T> {

 @Override

 public final T apply(final F from) {

 return (T) from;

 }

 }

 List<TypeParent> originalList = Lists.newArrayList();

 List<TypeChild> theList = Lists.transform(originalList,

 new CastFunction<TypeParent, TypeChild>());

無需番石榴的更簡單替代方案–涉及2個鑄造操作

List<Number> originalList = Lists.newArrayList();

 List<Integer> theList = (List<Integer>) (List<? extends Number>) originalList;

向集合添加可迭代

Iterable<String> iter = Lists.newArrayList();

 Collection<String> collector = Lists.newArrayList();

 Iterables.addAll(collector, iter);

**根據自定義匹配規則檢查集合中是否包含元素
**

Iterable<String> theCollection = Lists.newArrayList("a", "bc", "def");

 boolean contains = Iterables.any(theCollection, new Predicate<String>() {

 @Override

 public boolean apply(final String input) {

 return input.length() == 1;

 }

 });

 assertTrue(contains);

使用搜索的替代解決方案

Iterable<String> theCollection = Sets.newHashSet("a", "bc", "def");

 boolean contains = Iterables.find(theCollection, new Predicate<String>() {

 @Override

 public boolean apply(final String input) {

 return input.length() == 1;

 }

 }) != null;

 assertTrue(contains);

僅適用於Set的替代解決方案

Set<String> theCollection = Sets.newHashSet("a", "bc", "def");

 boolean contains = !Sets.filter(theCollection, new Predicate<String>() {

 @Override

 public boolean apply(final String input) {

 return input.length() == 1;

 }

 }).isEmpty();

 assertTrue(contains);

找不到任何內容時,在Iterables.find上出現NoSuchElementException

Iterable<String> theCollection = Sets.newHashSet("abcd", "efgh", "ijkl");

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

 @Override

 public boolean apply(final String input) {

 return input.length() == 1;

 }

 };

 String found = Iterables.find(theCollection, inputOfLengthOne);

–這將引發**NoSuchElementException異常**:

java.util.NoSuchElementException


 at com.google.common.collect.AbstractIterator.next(AbstractIterator.java:154)


 at com.google.common.collect.Iterators.find(Iterators.java:712)


 at com.google.common.collect.Iterables.find(Iterables.java:643)

解決方案:有一個重載的find方法,該方法將默認返回值作為參數,可以針對所需的行為使用null進行調用:

String found = Iterables.find(theCollection, inputOfLengthOne, null);

從集合中刪除所有空值

List<String> values = Lists.newArrayList("a", null, "b", "c");

 Iterable<String> withoutNulls = Iterables.filter(values, Predicates.notNull());

直接創建不可變的列表/集合/地圖

ImmutableList<String> immutableList = ImmutableList.of("a", "b", "c");

 ImmutableSet<String> immutableSet = ImmutableSet.of("a", "b", "c");

 ImmutableMap<String, String> imuttableMap =

 ImmutableMap.of("k1", "v1", "k2", "v2", "k3", "v3");

從標準集合創建不可變的列表/集合/地圖

List<String> muttableList = Lists.newArrayList();

 ImmutableList<String> immutableList = ImmutableList.copyOf(muttableList);



 Set<String> muttableSet = Sets.newHashSet();

 ImmutableSet<String> immutableSet = ImmutableSet.copyOf(muttableSet);



 Map<String, String> muttableMap = Maps.newHashMap();

 ImmutableMap<String, String> imuttableMap = ImmutableMap.copyOf(muttableMap);

使用構建器的替代解決方案

List<String> muttableList = Lists.newArrayList();

 ImmutableList<String> immutableList =

 ImmutableList.<String> builder().addAll(muttableList).build();



 Set<String> muttableSet = Sets.newHashSet();

 ImmutableSet<String> immutableSet =

 ImmutableSet.<String> builder().addAll(muttableSet).build();



 Map<String, String> muttableMap = Maps.newHashMap();

 ImmutableMap<String, String> imuttableMap =

 ImmutableMap.<String, String> builder().putAll(muttableMap).build();

3.前進

正如我在一開始提到的那樣,我正在嘗試使用這種不同的格式-食譜-來嘗試收集在一個地方使用Guava Collections的簡單常見任務。這種格式的重點是簡單性和速度,因此,除了代碼示例本身之外,大多數食譜都沒有其他解釋

最終–我將其視為一份生動的文檔–在我碰到它們時,我將繼續添加食譜和示例。請隨時在評論中提供更多信息,我希望將其納入食譜。

所有這些示例和代碼段的實現都**可以在GitHub上找到**-這是一個基於Maven的項目,因此應該很容易直接導入和運行。