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.gzsudo 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>() {@Overridepublic 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>() {@Overridepublic 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;
}
