集合处理
List集合拼接成以逗号分隔的字符串
list.stream().collect(Collectors.joining(","));
String.join(",", list)
两个List集合取交集
list1.retainAll(list2)
交集、并集、差集
1 | /*交集*/ |
使用parallelStream时要注意线程安全问题
- 在并发时使用HashMap和ArrayList等非线程安全的类是会存在问题的
- 应使用
- list合并:
1
2
3
4Stream.of().parallel()
.mapToObj(index -> {
return Collections.<T>emptyList();
}).flatMap(Collection::stream).collect(Collectors.toList()); - map合并:
1
2
3
4
5
6Stream.of().parallel()
.mapToObj(index -> {
return Collections.<K, V>emptyMap();
})
.flatMap(x -> x.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1));
- list合并:
排序
list.sort(Comparator.comparing(XXX::getXX, Comparator.reverseOrder()).thenComparing(XXX::getXXX))
1
2
3
4
5
6
7
8
9
10
11
12
13
14list.sort(
Comparator.comparing((Function<XXXBO, Integer>)xxxBO -> {
if (ids.contains(xxxBO.getId())) {
return 0;
}
return 1;
}).thenComparing(xxxBO -> {
if (ptIds.contains(xxxBO.getTId())) {
return 0;
}
return 1;
})
.thenComparing(XXXBO::getAddTime, Comparator.reverseOrder())
.thenComparing(XXXBO::getId, Comparator.reverseOrder()));
字符串
首字母转成大写
StringUtils.capitalize(str);
重复拼接字符串
StringUtils.repeat("ab", 2);
字符串分割
1 | Iterable<String> split = Splitter.on(',') |
日期
Date类型转String类型
String date = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
String类型转Date类型
Date date = DateUtils.parseDate("2021-05-01 01:01:01", "yyyy-MM-dd HH:mm:ss");
计算一个小时后的日期
Date date = DateUtils.addHours(new Date(), 1);
java8
1 | long tomorrowZeroTime = LocalDate.now().plusDays(1).atTime(LocalTime.MIN).atZone(ZoneId.systemDefault()).toEpochSecond(); |
开源库
commons-collections4
1 | // 两个集合取交集 |
common-beanutils 操作对象
1 | User user = new User(); |
commons-io 文件流处理
1 | File file = new File("demo1.txt"); |
Google Guava 工具类库
1 | //创建集合 |
其他
比较两个对象是否相等
Objects.equals(strA, strB);
(防止空指针)
异步
1.
1 | CompletableFuture.supplyAsync( |
2.
1 | CompletableFuture.runAsync(() -> { |
重写toString
1 |
|
Stream
1 | Map<String, String> requestMap = |
Optional
1 | .orElseThrow(() -> new ContextedRuntimeException("notExist").addContextValue("id", id)); |
Optional中map和flatMap
1 | class FlightTicketInfo { |
- 1.9新增 or()方法是作为orElse()和orElseGet()方法的改进而出现的,使用方法一致,但后两个方法在执行完成后返回的并非包装值。如果需要执行一些逻辑并返回Optional时,可以使用or()方法。该方法传入Supplier接口的实例,当value有值时直接返回自身Optional,当为空时,自动执行suuplier的get()方法,并包装成Optional返回,其源码中包装的语句如下:
1 | Optional<T> r = (Optional<T>) supplier.get(); |
- stream()方法则不用多说,是一个提供给流式编程使用的方法,功能上是一个适配器,将Optional转换成Stream:没有值返回一个空的stream,或者包含一个Optional的stream。其源码如下:
1 | if (!isPresent()) { |
- 其原因是orElseGet()的参数是Supplier目标类型的函数,简单来说,Suppiler接口类似Spring的懒加载,声明之后并不会占用内存,只有执行了get()方法之后,才会调用构造方法创建出对象,而orElse()是快加载,即使没有调用,也会实际的运行。
这个特性在一些简单的方法上差距不大,但是当方法是一些执行密集型的调用时,比如远程调用,计算类或者查询类方法时,会损耗一定的性能。
orElseThrow()方法与orElseGet()方法的参数都是Supplier参数都是函数类型的,这意味着这两种方法都是懒加载,但针对于必须要使用异常控制流程的场景,orElseThrow()会更加合适,因为可以控制异常类型,使得相比NPE会有更丰富的语义。
BigDecimal
user.getMoney().stripTrailingZeros().toPlainString()
1 | public BigDecimal sum(Function<XXX, BigDecimal> get, List<XXX> list) { |
包装临时对象
- 当一个方法需要返回两个及以上字段时,可以使用Pair和Triple
- 返回两个字段
ImmutablePair<Integer, String> pair = ImmutablePair.of(1, "yideng");
- 返回三个字段
ImmutableTriple<Integer, String, Date> triple = ImmutableTriple.of(1, "yideng", new Date());
临时文件返回
1 |
|
线程池
1 | ExecutorService executor = new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2, new BasicThreadFactory.Builder().namingPattern("common-schedule-pool-%d").daemon(true).build()); |
- Java线程池中三种方式创建 ThreadFactory 设置线程名称: https://blog.csdn.net/u010648555/article/details/106137206
扫描注解
1 |
|
1 | <groupId>org.reflections</groupId> |
并发
1 | CompletableFuture<Boolean> future = CompletableFuture.supplyAsync(() -> { |
1 | List<Supplier<Boolean>> tasks = new ArrayList<>(2); |
1 | CompletableFuture<CallResult> future1 = CompletableFuture.supplyAsync(() -> { |
1 | return IntStream.range(0, DBTableConfig.SIZE).parallel() |
1 | CompletableFuture<Void> cf6 = CompletableFuture.allOf(cf3, cf4, cf5); |
开源类库
- apache commons
- commons-lang3
- commons-collections
Web
1 | RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); |
1 | /** |
- long 前端失精问题
1
2
3
4
5
6
7
8
9
10
11
12
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
Jackson2ObjectMapperBuilderCustomizer customizer = new Jackson2ObjectMapperBuilderCustomizer() {
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance)
.serializerByType(Long.TYPE, ToStringSerializer.instance);
}
};
return customizer;
}
MyBatis
1 | <select id="queryBookInfo" parameterType="com.tjt.platform.entity.BookInfo" resultType="java.lang.Integer"> |
1 | @Select({ |