Guava工具集
使用和避免null
1、创建Optional对象
1)创建一个空的Optional:Optional.empty()
2)创建一个不为空的Optional,如果为空立马抛出异常:Optional.of("xxx");
3)创建一个任意的Optional,可以为null,也可以不为null:Optional.ofNullable(null)
2、判断引用是否缺失(是否为null)
optional1.isPresent()//不建议使用
optional1.ifPresent(System.out::print);//当引用存在时执行
@Test
public void test() {
//创建Optional对象
Optional<String> optional1=Optional.ofNullable("123");
String a1=optional1.orElse(getDefaultValue());
System.out.println("a1="+a1);
String a2=optional1.orElseGet(()->{return getDefaultValue();
});
System.out.println("a2="+a2);
optional1.orElseThrow(()->{
throw new RuntimeException("引用缺失");
});
optional1.ifPresent(System.out::print);
}
public String getDefaultValue(){ //远程方法调用
System.out.println("我被调用了!");
return "我是默认值";
}
orElse和orElseGet的区别:orElse一定会去执行方法,但是不拿返回值,orElseGet引用为null时才去执行方法,一般使用orElseGet。
引用缺失时抛出异常
optional1.orElseThrow(()->{
throw new RuntimeException("引用缺失");
});
举个例子:如何使用op避免空指针
@Test
public void testMap(){
List<String> strList=null;
strList.stream().forEach(System.out::println);
}
@Test
public void testMap1(){
List<String> strList=null;
Optional.ofNullable(strList)
.map(List::stream)
.orElseGet(Stream::empty)
.forEach(System.out::println);
}
.map(List::stream)如果引用不为空就执行方法,将list变成stream。如果为空就返回一个Optional
.orElseGet(Stream::empty)如果引用为空,创建一个空的stream
以上代码就巧妙的避免了list的空指针异常。
不可变集合
1、首先jdk为了提供了产生不可变集合的方法
@Test
public void test() {
ArrayList<Integer> list=new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
List<Integer> newlist = Collections.unmodifiableList(list);
newlist.remove(0);
System.out.println(list);
}
2、guava方式
@Test
public void test1() {
ArrayList<Integer> list=new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
// 通过已存在的集合创建
ImmutableSet immutableSet=ImmutableSet.copyOf(list);
// 通过初始值创建
ImmutableSet immutableSet1=ImmutableSet.of(1, 2);
// 以bulider方式创建
ImmutableSet immutableSet2=ImmutableSet.builder()
.add(1)
.addAll(Sets.newHashSet(2,3))
.add(4)
.build();
}
新集合类型

Multiset

Multiset:
与list相关的特点:没有元素顺序限制的ArrayList
与Map相关的特点:Map<E,Integer>,键为元素,值为计数
count(Object):返回给定元素的计数
entrySet():返回Set<Mulitset.Entry<E>>,和Map的entrySet类似
elementSet():返回所有不重复元素的Set<E>,和Map的keySet类似。

需求:统计一篇文章,文字出现的频率。
@Test
public void test() {
String text="南陵别儿童入京" +
"唐代:李白" +
"白酒新熟山中归,黄鸡啄黍秋正肥。" +
"呼童烹鸡酌白酒,儿女嬉笑牵人衣。" +
"高歌取醉欲自慰,起舞落日争光辉。" +
"游说万乘苦不早,著鞭跨马涉远道。" +
"会稽愚妇轻买臣,余亦辞家西入秦。" +
"仰天大笑出门去,我辈岂是蓬蒿人。";
Multiset<Character> multiset=HashMultiset.create();
char[] chars=text.toCharArray();
Chars.asList(chars).stream().forEach(item->{
multiset.add(item);
});;
System.out.println("size="+multiset.size());
System.out.println(multiset.count('人'));
}
集合工具类
1、使用Lists
@Test
public void test1() {
List<Integer> list=Lists.newArrayList(1,2,3,4,5,6,7);
// 将list拆分成3个一组
List<List<Integer>> partition=Lists.partition(list, 3);
System.out.println(JSON.toJSONString(partition));
// 反转
List<Integer> reverse=Lists.reverse(list);
System.out.println(JSON.toJSONString(reverse));
}
2、使用Sets
@Test
public void test1() {
Set set1=Sets.newHashSet(1,2,3);
Set set2=Sets.newHashSet(4,5,6);
// 并集
Set<Integer> set=Sets.union(set1, set2);
System.out.println(set);
// 交集
Set<Integer> set3=Sets.intersection(set1, set2);
System.out.println(set3);
// 差集:如果元素属于A,不属于B
Set<Integer> set4=Sets.difference(set1, set2);
System.out.println(set4);
// 相对差集:如果元素属于A,不属于B 或者,属于B不属于A
Set<Integer> set5=Sets.symmetricDifference(set1, set2);
System.out.println(set5);
// 拆解子集
Set<Set<Integer>> set6=Sets.powerSet(set1);
System.out.println(JSON.toJSONString(set6));
// 计算两个集合的笛卡尔积
Set<List<Integer>> set7=Sets.cartesianProduct(set1,set2);
System.out.println(JSON.toJSONString(set7));
}
IO

