Java中的集合
Java LinkedList指南
Java ArrayList指南
Java中不可變的ArrayList
CopyOnWriteArrayList指南
JavaJava中的多維ArrayList
將迭代器轉換為列表
Java –從列表中獲取隨機項目/元素
用Java對列表進行分區
從Java列表中刪除所有Null
從Java中的列表中刪除所有重複項
檢查Java中兩個列表是否相等
如何使用Java在列表中查找元素
Java列表UnsupportedOperationException
將列表複製到Java中的另一個列表
從列表中刪除所有出現的特定值
將多個元素添加到Java ArrayList
從列表中刪除第一個元素
在Java中迭代列表的方法
Java中兩個列表的交集
如何計算Arraylist中的重複元素
查找Java中兩個列表之間的差異
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的項目,因此應該很容易直接導入和運行。