Java 生态中新兴的技术体系:
- Spring Reactive → 背靠 Pivotal → 归属 VMware → 归属戴尔
- Quarkus 和 Vert.x → 背靠 Eclipse 基金会 → 主要由 Red Hat 支持
- Helidon → 背靠 Oracle
- Micronaut → 背靠 Object Computing(Grails、OpenDDS)
- Lagom → 背靠 Lightbend(Akka)
JDK(8和11)
下载
# 下载-解压-建立链接
tar zxvf openjdk-11_osx-x64_bin.tar.gz
sudo ln -sfh /Library/Java/JavaVirtualMachines/jdk-11.jdk jdk-11.jdk
版本支持计划:https://www.oracle.com/java/technologies/java-se-support-roadmap.html
Http客户端
Feign
Retrofit
https://square.github.io/retrofit/
https://gitee.com/lianjiatech/retrofit-spring-boot-starter
Forest
http://forest.dtflyx.com/
针对第三方接口,所以不需要依赖Spring Cloud和任何注册中心
缓存
Caffeine
https://github.com/ben-manes/caffeine
常用配置
- initialCapacity=[integer]: 初始的缓存空间大小
- maximumSize=[long]: 缓存的最大条数
- maximumWeight=[long]: 缓存的最大权重
- expireAfterAccess=[duration]: 最后一次写入或访问后经过固定时间过期
- expireAfterWrite=[duration]: 最后一次写入后经过固定时间过期
- refreshAfterWrite=[duration]: 创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存
- weakKeys: 打开key的弱引用
- weakValues:打开value的弱引用
- softValues:打开value的软引用
- recordStats:开发统计功能
注意
- expireAfterWrite和expireAfterAccess同事存在时,以expireAfterWrite为准。
- maximumSize和maximumWeight不可以同时使用
weakValues和softValues不可以同时使用
Caffeine<String, String> cache = Caffeine.newBuilder()
// 数量上限
.maximumSize(1024)
// 过期机制
.expireAfterWrite(5, TimeUnit.MINUTES)
// 弱引用key
.weakKeys()
// 弱引用value
.weakValues()
// 剔除监听
.removalListener((RemovalListener<String, String>) (key, value, cause) -> System.out
.println("key:" + key + ", value:" + value + ", 删除原因:" + cause.toString()));
AsyncLoadingCache<String, String> asyncLoadingCache = Caffeine.newBuilder()
// 数量上限
.maximumSize(2)
// 失效时间
.expireAfterWrite(5, TimeUnit.MINUTES).refreshAfterWrite(1, TimeUnit.MINUTES)
// 异步加载机制
.buildAsync(new CacheLoader<String, String>() {
@Override
public String load(@NonNull String key) throws Exception {
// 获取待缓存数据
return key;
}
});
LoadingCache<String, String> loadingCache = Caffeine.newBuilder()
// 数量上限
.maximumSize(2)
// 失效时间
.expireAfterWrite(5, TimeUnit.MINUTES)
//
.refreshAfterWrite(1, TimeUnit.MINUTES)
// 异步加载机制
.build(new CacheLoader<String, String>() {
@Override
public String load(@NonNull String key) throws Exception {
// 刷新获取待缓存数据
return key;
}
});
加密解密
Password4j
https://github.com/Password4j/password4j
支持PBKDF2、Argon2、BCrypt、SCrypt
<dependency>
<groupId>com.password4j</groupId>
<artifactId>password4j</artifactId>
<version>1.5.2</version>
</dependency>
常用工具类
Poi处理Excel
/**
* 添加下拉选择
*
* @param xssfWorkbook
* @param xssfSheet
* @param selectList
* 待选择内容,长度不超过65535
* @param cellList
* 例如 new CellRangeAddressList(1, 755350, 0, 2);
* 参数分别为:起始行、终止行、起始列、终止列
*/
private static void addSelectRow(XSSFWorkbook xssfWorkbook, XSSFSheet xssfSheet, String[] selectList,
CellRangeAddressList cellList) {
int sheetTotal = xssfWorkbook.getNumberOfSheets();
String hiddenSheetName = "hiddenSheet" + sheetTotal;
XSSFSheet hiddenSheet = xssfWorkbook.createSheet(hiddenSheetName);
Row row = null;
// 写入下拉数据到新的sheet页中
for (int i = 0, len = selectList.length; i < len; i++) {
row = hiddenSheet.createRow(i);
Cell cell = row.createCell(0);
cell.setCellValue(selectList[i]);
}
// 获取新sheet页内容
String strFormula = hiddenSheetName + "!$A$1:$A$65535"; // 定位到用来加载列的新的sheet页,后面则是A列的1-65535为有效性List条件
XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(
DataValidationConstraint.ValidationType.LIST, strFormula);
// 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
// 这里终止行建议不要过大,取Integer.MAX_VALUE 无效
DataValidationHelper validationHelper = new XSSFDataValidationHelper(xssfSheet);
DataValidation validation = validationHelper.createValidation(constraint, cellList);
xssfSheet.addValidationData(validation);
xssfWorkbook.setSheetHidden(sheetTotal, true);
}
提取文本中的URL
static final String URL_REGEX = "(https?|http)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]";
static final Pattern URL_PATTERN = Pattern.compile(URL_REGEX);
/**
*
* @param text
* @return 提取文本中的第一个URL
*/
public static String findFirstUrl(String text) {
Matcher matcher = URL_PATTERN.matcher(text);
if (matcher.find()) {
return matcher.group();
}
return null;
}
/**
*
* @param text
* @return 提取文本中全部URL
*/
public static List<String> findUrl(String text) {
Matcher matcher = URL_PATTERN.matcher(text);
List<String> urlList = new ArrayList<>();
while (matcher.find()) {
urlList.add(matcher.group());
}
return urlList;
}