这是我参与新手入门的第2篇文章
一. 集合连接和分割
1. Joiner 连接器
-
拼接字符串之List(数组)
jdk
List<String> list = new ArrayList<>(); list.add("1"); list.add(null); list.add("2"); StringBuilder sb = new StringBuilder(); list.stream().filter(e -> StrUtil.isNotBlank(e)).forEach(e -> sb.append(e).append(",") ); // 省略检查sb是否有值 sb.setLength(sb.length() - 1); System.err.println(sb.toString());//1,2 复制代码
guava这么做
String join = Joiner.on(",").skipNulls().join(list); System.err.println(join);//1,2 复制代码
Hutool 也可以实现简单的连接
CollUtil.join(list, ",");//1,null,2 复制代码
-
拼接字符串之Map
guava
Map<String, String> map = new HashMap<>(); map.put("001", "张三"); map.put("002", "李四"); String guava = Joiner.on("&").withKeyValueSeparator("=").join(map); System.err.println(guava);//001=张三&002=李四 复制代码
2. Splitter分割器
-
字符串分割成List
String str = "001, ,002,,003,"; List<String> guava = Splitter.on(",").trimResults().omitEmptyStrings().splitToList(str); // trimResults()解决001,后的, , omitEmptyStrings解决002,, System.err.println(guava);// [001, 002, 003] // 迭代器 Iterable<String> ite = Splitter.on(",").trimResults().omitEmptyStrings().split(str); ite.forEach(e->{ // ... }); 复制代码
-
字符串分割成类Map
String str = "001=张三&002=李四&003=王五";
Map<String, String> guava = Splitter.on("&").withKeyValueSeparator("=").split(str);
System.err.println(guava);//{001=张三, 002=李四, 003=王五
复制代码
二. Map
1. 二维数据结构 Table<R, C, V>
-
由两个key决定一个value,类似于坐标系
-
解决Map<key,Map< key,value>>的情况
-
常用 HashBasedTable、TreeBasedTable
java vs guava 代码
-
java v1 不定义对象,判断多,代码不简洁
@Test public void testJdkNoDefinitionObject() { Map<Object, Map<Object, Object>> jdk = new HashMap<Object, Map<Object, Object>>(2); Map<Object, Object> x1 = jdk.get("x1"); if (x1 != null) { x1.put("y1", 1); } else { x1 = new HashMap<Object, Object>(2); x1.put("y1", 1); } // 同理放入x2,y2,2,省略.... // 取值,如获取 x1,y1对应的值 jdk.get("x1").get("y1"); } 复制代码
-
java v2 定义对象,代码少,但需要额外定义对象
@Test public void testJdkDefinitionObject() { // jdk 定义对象,代码少,但需要额外定义对象 Map<Object, Object> jdk = new HashMap<Object, Object>(2); jdk.put(new DemoKey("x1", "y1"), 1); // 同理放入x2,y2,2 jdk.put(new DemoKey("x2", "y2"), 2); // 取值,如获取 x1,y1对应的值 jdk.get(new DemoKey("x1", "y1")); } class DemoKey { private String x; private String y; // 重写Equale 和HashCode 方法 public DemoKey(String x, String y) { this.x = x; this.y = y; } } 复制代码
- guava 代码简洁明了
@Test public void testGuava() { // guava 代码简洁明了 HashBasedTable<Object, Object, Object> guava = HashBasedTable.create(); // 存值 guava.put("x1", "y1", 1); guava.put("x2", "y2", 2); // 取值 guava.get("x1", "y1"); } 复制代码
-
2. 一键多值的 Multimap<K, V>
-
一个key对应多个value的map
-
解决自己new value集合的问题
-
常用ArrayListMultimap、HashMultimap
代码
-
java
@Test public void jdkTest(){ Map<String, List<Object>> jdk = new HashMap<String, List<Object>>(3); // 存值 A:A1 List<Object> value = jdk.get("A"); if (value != null) { value.add("A1"); } else { value = new ArrayList<Object>(); value.add("A1"); } // 存值 A:A2 ,省略 } 复制代码
-
guava
@Test public void guavaTest(){ Multimap<String, String> guava = ArrayListMultimap.create(); guava.put("A", "A1"); guava.put("A", "A2"); System.err.println(guava.size());// 2 // 取值,value 类似于视图,操作会影响原集合 Collection<String> value = guava.get("A"); } 复制代码
-
3. key和value 可翻转的BiMap
-
根据key取value 经常用,某些场景下根据value取key
-
key和value 唯一
- 相同的key 以最后为准
@Test public void test(){ HashBiMap<Object, Object> bimap = HashBiMap.create(); bimap.put("001", "张三"); bimap.put("002", "李四"); bimap.put("002", "王五"); BiMap<Object, Object> inverse = bimap.inverse(); System.err.println(inverse.get("张三")); //001 System.err.println(inverse.get("李四")); // null System.err.println(inverse.get("王五")); // 002 } 复制代码
-
put相同的value会异常
bimap.put("003", "王五"); >> java.lang.IllegalArgumentException: value already present: 王五 复制代码
解决办法是用 forcePut
// 暴力,以最后插入的数据为准,省去烦恼 bimap.forcePut("003", "王五"); 复制代码
三.SET
### 1. 值重复的Multiset
复制代码
用来计数,比如有字符串
复制代码
比如有字符串,需要统计里面a出现的次数,可以这么做
String str = "a,b,c,a,b,a,c,b,e,r";
List<String> list = Splitter.on(",").splitToList(str);
HashMultiset<String> guava = HashMultiset.create();
guava.addAll(list);
System.err.println(guava.count("a"));// 3
复制代码
当然Multiset也实现了Collection接口,具有集合的一些常规操作
-
集合求差交并
有以下两个集合
HashSet<String> set1 = Sets.newHashSet("张三001", "张三002", "张三003"); HashSet<String> set2 = Sets.newHashSet("张三002", "张三003", "张三004"); 复制代码
求差集
复制代码
求交集
HashSet<String> set1 = Sets.newHashSet("张三001", "张三002", "张三003"); HashSet<String> set2 = Sets.newHashSet("张三002", "张三003", "张三004"); // 求差集(注意根据参数位置是第一个集合有,第二个集合没有) Sets.SetView<String> difference = Sets.difference(set1, set2); System.err.println(difference);// [张三001] // 求交集 Sets.SetView<String> intersection = Sets.intersection(set1, set2); System.err.println(intersection);//[张三002, 张三003] // 求并集 Sets.SetView<String> union = Sets.union(set1, set2); System.err.println(union); // [张三002, 张三001, 张三003, 张三004] 复制代码
求并集
复制代码
如果集合里面是java Bean,记得重写equals和hashCode。
四. …
:创建List
jdk这么做
List<Object> jdk = new ArrayList<>();
jdk.add("A");
jdk.add("B");
复制代码
guava这么做
List<String> guava = Lists.newArrayList("A", "B");
复制代码
Lists. Maps.
…
// 1
public static final ImmutableSet<Color> GOOGLE_COLORS =
ImmutableSet.<Color>builder()
.addAll(WEBSAFE_COLORS)
.add(new Color(0, 191, 255))
.build();
//2
ImmutableSet.of("a", "b", "c", "a", "d", "b")
复制代码
以上仅为抛转,更多Guava精彩,大家一起发现!
参考
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END