零零散散
# jdk安装
mac m1 安装 :java jdk、支持动态切换jdk (opens new window)
MAC JDK 卸载方法(彻底卸载) (opens new window)
# 常用工具方法
# guava工具
# 集合(Lists)
# 1.创建和添加对象
正常情况下,我们在java
中创建和使用List
的时候,基本都是这样的:
// 创建集合
List<String> stringList1 = new ArrayList<>();
// 添加对象
stringList1.add("hello");
stringList1.add("world");
但是,如果你用了guava
,那上面这些你都可以一步到位:
List<String> stringList2 = Lists.newArrayList("hello", "world");
还支持直接传入数组:
String[] strings = new String[] {"1231", "23432423"};
ArrayList<String> strings1 = Lists.newArrayList(strings);
# 2.list分割
更强大的是,它还支持List
分割,我们在日常开发中经常有这样的需求,比如某个接口或方法限制了List
数据量大小(比如list
的大小不能超过200
),这时候你如果自己手动写一个分割工具类就很麻烦,但如果用guava
,那就很简单:
List<List<String>> partition = Lists.partition(stringList1, 200);
上面代码的作用就是把我们的stringList1
分割成200
一份的小list
,这时候你再配合上forEach
,需求就完美实现了。
让你的开发过程更简单,更便捷,其他List
的子类创建类似。
# 3.list反转
实际开发中,经常要将list
反转,比如1, 2, 3, 4
的list
反转成4, 3, 2, 1
,自己写的话,需要写个for
循环,然后反向输出到另一个List
,但是用guava
就贼简单:
List<Integer> integerList = Lists.newArrayList(1, 2, 3, 4);
// 反转list
List<Integer> reverse = Lists.reverse(integerList);
# 4.list转换
比如我要将一个List<String>
根据一定的条件转换成一个List<Boolean>
,我可以这样操作:
List<String> stringList2 = Lists.newArrayList("hello", "world", "");
List<Boolean> transform = Lists.transform(stringList2, s -> !"".equals(s));
我转换的条件是只有不是空字符串就是true
,这里s -> !"".equals(s)
是lamubda
表达式的写法(最近一直在提这个,这个现在确实已经是主流了,展开写确实占行数:
List<Boolean> transform2 = Lists.transform(stringList2,
new Function<String, Boolean>() {
@Override
public @Nullable Boolean apply(@Nullable String input) {
return !"".equals(input);
}
});
# Maps
# 1.创建map
HashMap<Object, Object> objectObjectHashMap = Maps.newHashMap();
HashMap<Object, Object> objectObjectHashMap1 = Maps.newHashMap(objectObjectHashMap);
// 空map
Map<String, String> params = Maps.newHashMap();
# 2.比较两个map
这个方法就很强大,不仅可以返回两个map
的交集,还能返回每个map
不同的地方,结果都是map
这个方法就很强大,不仅可以返回两个map
的交集,还能返回每个map
不同的地方,结果都是map
HashMap<Object, Object> objectObjectHashMap = Maps.newHashMap();
objectObjectHashMap.put("k1", "v1");
objectObjectHashMap.put("k2", "v2");
objectObjectHashMap.put("k3", "v3");
HashMap<Object, Object> objectObjectHashMap1 = Maps.newHashMap(objectObjectHashMap);
objectObjectHashMap.put("k4", "v4");
objectObjectHashMap1.put("k5", "v5");
// 比较两个map
MapDifference<Object, Object> difference = Maps.difference(objectObjectHashMap, objectObjectHashMap1);
// 返回交集
Map<Object, Object> objectObjectMapCommon = difference.entriesInCommon();
// 返回左侧map特有的
Map<Object, Object> objectObjectMap1Left = difference.entriesOnlyOnLeft();
// 返回右侧map特有的
Map<Object, Object> objectObjectMap2Right = difference.entriesOnlyOnRight();
System.out.println(objectObjectMapCommon);
System.out.println(objectObjectMap1Left);
System.out.println(objectObjectMap2Right);
# 3.将集合转为Map
这里还提供了将List
等集合转为map
的方法:
ImmutableMap<String, String> stringStringImmutableMap2 = Maps.toMap(stringList, s -> s);
上面的代码就是将一个list
转成key
和value
都一样的map
。
或者将map
转换为新的map
:
ImmutableMap<Map.Entry<String, Object>, Boolean> entryBooleanImmutableMap = Maps.toMap(stringObjectImmutableMap.entrySet(), k -> "123123".equals(k));
# 日志打印
log.error打印异常堆栈问题 (opens new window)
# @EnableAsync
SpringBoot利用@Async注解实现异步调用 (opens new window)
@EnableAsync的使用、进阶、源码分析 (opens new window)
SpringBoot注解@Async (opens new window)
注意:异步方法sync虽然加了@Async,但由于sync是在同个类里面,对于主方法mainFunc来说,调用子异步方法sync是通过当前对象去调用的,而不是通过代理对象,因而@Async不生效