Joiner
Joiner的作用是:把集合(或数组或可变参数)通过指定的分隔符连接成字符串
1.传统的方法实现(代码量多,还需要考虑第一个元素的特殊情况)
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < list.size(); i++) {
if (i == 0) {
sb.append(list.get(i));
} else {
sb.append(",");
sb.append(list.get(i));
}
}
System.out.println(sb.toString());
}
2.使用guava的Joiner实现
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Joiner joiner = Joiner.on(",");
String s = joiner.join(list);
System.out.println(s);
String res = Joiner.on(",").join(list);
System.out.println(res);
}
3.如果待处理的集合中存在null值,需要使用skipNulls处理,跳过null值,否则会报NPE
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(null);
String s = Joiner.on(",").skipNulls().join(list);
System.out.println(s);
}
4.可以使用useForNull替代集合中的null值
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(null);
String s = Joiner.on(",").useForNull("这是null的替代值").join(list);
System.out.println(s);
}
Splitter
splitter的作用是:通过指定的分隔符把字符串转换为集合
public static void main(String[] args) {
String s = "a,b,c,, d ,\"\"";
Splitter splitter = Splitter.on(",")
.omitEmptyStrings()
.trimResults();
Iterable<String> iterable = splitter.split(s);
System.out.println(iterable);
List<String> list = splitter.splitToList(s);
System.out.println(list);
}
Lists
和Lists类似的还有Sets、Maps
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(2);
list1.add(3);
ArrayList<Integer> list2 = Lists.newArrayList(1, 2, 3);
List<List<Integer>> partition = Lists.partition(list2, 2);
System.out.println(partition);
}
将一个List集合按照某种规则转化为另一个List集合
public static void main(String[] args) {
List<String> list = Lists.newArrayList("a", "ab", "abc");
System.out.println(list);
List<Integer> transform = Lists.transform(list, s -> s.length());
System.out.println(transform);
}
Maps
使用HashMap,为了避免HashMap扩容带来的性能开销(每次扩容都会rehash,性能损耗较大),如果提前知道存放的元素个数,在创建HashMap集合的时候应该指定集合的容量
public static void main(String[] args) {
Map<String, Integer> map1 = new HashMap<>(16);
HashMap<String, Integer> map2 = Maps.newHashMapWithExpectedSize(16);
}
Ints
类似的还有Longs、Doubles、Floats
public static void main(String[] args) {
int[] array = {1, 2, 3};
List<Integer> list = Ints.asList(array);
System.out.println(list);
double[] d = {1.0, 2.0, 3.0};
List<Double> doubles = Doubles.asList(d);
System.out.println(doubles);
}
MultiSet
原生jdk为我们提供的Set集合是无序不可重复的,那如果我们想要一个无序可重复的集合,就可以使用guava提供的MultiSet,使用MutilSet可以实现元素计数的需求,例如我们想统计每个元素出现的次数,就不再需要依赖于创建一个Map集合进行统计了
public static void main(String[] args) {
Multiset<String> multiset = HashMultiset.create();
multiset.add("a");
multiset.add("b");
multiset.add("c");
multiset.add("a");
System.out.println(multiset);
Set<String> set = multiset.elementSet();
System.out.println(set);
Set<Multiset.Entry<String>> entries = multiset.entrySet();
for (Multiset.Entry<String> entry : entries) {
System.out.println("元素:" + entry.getElement() + ",个数:" + entry.getCount());
}
}
MultiMap
MultiMap主要是用来替代jdk原生的类似这种value值也是一个集合的场景,例如:Map<String, List<Integer>>,使用原生jdk方式实现这种map集合会比较复杂
- 原生jdk实现
public static void main(String[] args) {
Map<String, List<Integer>> map = new HashMap<>();
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
map.put("a", list);
System.out.println(map);
}
- guava的api实现
public static void main(String[] args) {
Multimap<String, Integer> map = HashMultimap.create();
map.put("a", 1);
map.put("a", 2);
map.put("a", 3);
System.out.println(map);
System.out.println(map.containsEntry("a", 1));
Map<String, Collection<Integer>> jdkMap = map.asMap();
}
不可变集合
guava为我们提供了非常实用的不可变集合,例如ImmutableList、ImmutableSet、ImmutableMap,可以保证我们创建的集合不被修改,如果别人修改了,程序会抛出异常;不可变集合的应用场景有:假设我们有一些值存放到缓存中,希望这部分值是只读的,别人不能修改,就可以使用这些不可变集合
PS:应该尽量使用不可变集合,性能更佳
public static void main(String[] args) {
ImmutableList<Object> immutableList = ImmutableList.builder().add(1).build();
ImmutableMap<Object, Object> immutableMap = ImmutableMap.builder().put("a", 1).build();
ImmutableSet<Object> immutableSet = ImmutableSet.builder().add(1).build();
ImmutableMap<String, Integer> immutableMap = ImmutableMap.of("a", 1, "b", 2);
System.out.println(immutableMap);
ImmutableList<Integer> immutableList = ImmutableList.of(1, 2);
System.out.println(immutableList);
}
虽然jdk有类似的api可以实现不可变集合,但是并无法完全保证是不可变的集合,例如:
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
List<Integer> unmodifyList = Collections.unmodifiableList(list);
list.add(2);
System.out.println(unmodifyList);
}
|