Skip to content

【Code】Java高频代码备忘录

Map

根据key排序

java
Map<String, String> sortMap = 
        new TreeMap<>((String s1, String s2) -> s1.compareTo(s2));
sortMap.putAll(map);

快速构建Map

java
private Map<Integer, String> newsEventMap = new HashMap<Integer, String>(){{
  put(k1, "v1");
  put(k2, "v2");
}};

获取第一个元素

java
map.entrySet().stream().findFirst();

List

交换两个元素位置

java
Collections.swap(list, 0, 6);

按数量分批

java
// guava
Lists.partition(list, 500);// 每500个分为1组
// apache common collection
ListUtils.partition(list, 500);

排序

java
// 升序 
list.sort(Comparator.comparing(Xxx::getXxx));
// 降序
list.sort(Comparator.comparing(Xxx::getXxx).reversed());

分组后排序

java
// null在前,其它倒排
list.stream().collect(
        Collectors.groupingBy(Xxx::getXxx,
            Collectors.collectingAndThen(Collectors.toList(),
                o -> o.stream().sorted(Comparator.comparing(Xxx::getYyy))
                        .collect(Collectors.toList())
        ))
);
java
// null在前,其它倒排
list.stream().sorted(Comparator.comparing(Xxx::getXxx,
    Comparator.nullsLast(Xxx::compareTo)).reversed()).collect(Collectors.toList());

按汉字首字母排序

java
List<String> list = Arrays.asList(
  new String[]{"中山","汕头","广州","安庆","阳江","南京","武汉","北京","安阳","北方"}
);
list = list.stream()
           .sorted(Collator.getInstance(Locale.CHINA))
           .collect(Collectors.toList());
java
public class Main {
    public static void main(String[] args) {
        List<Address> list = Arrays.asList(new Address[]{
                new Address("中山"), 
                new Address("汕头"), 
                new  Address("广州")}
        );
        list = list.stream().sorted(
                    Comparator.comparing(o -> 
                            Collator.getInstance(Locale.CHINA)
                                    .getCollationKey(o.getName())
                    )
                ).collect(Collectors.toList());
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    private static class Address {
        public String name;
    }
}

转Map

java
// guava
Maps.uniqueIndex(list, Object::getKey);// key objecct

collectors.toMap()值为空导致空指针解决方法

java
Map<Integer, Boolean> collect = list.stream().collect(
            HashMap::new, (m,v)-> m.put(v.getId(), v.getAnswer()), HashMap::putAll
        );

按属性统计数量(校验重复数量)

java
Map<String, Long> map = list.stream()
        .map(Xxx::getXxx)
        .collect(Collectors.groupingBy(
                Function.identity(), Collectors.counting()
        ));

JSON

Gson转换指定泛型类型

java
List<Object> list = new Gson()
        .fromJson("{}", new TypeToken<List<Object>>() {}.getType());

ObjectMap转换指定泛型类型

java
Map<String, String> json = new ObjectMapper()
        .readValue("{}", new TypeReference<Map<String, String>>() {});

详情见:https://www.baeldung.com/java-super-type-tokens

String

编码转换

java
new String("string".getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)

日期时间

获取当天的开始时间和结束时间

java
//当天开始
LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
//当天结束
LocalDateTime todayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);

获取当年的开始时间和结束时间

java
Date startDate = Date.from(LocalDate.now().with(TemporalAdjusters.firstDayOfYear())
        .atStartOfDay(ZoneId.systemDefault()).toInstant());
Date endDate = Date.from(LocalDate.now().with(TemporalAdjusters.lastDayOfYear())
        .atTime(LocalTime.MAX)
        .atZone(ZoneId.systemDefault()).toInstant());

获取当前时间到第二天的时间差

java
public final class DateUtils {
  private DateUtils() {
  }

  /**
   * 获取当前时间直到当天结束的时间差
   *
   * @param currentTime
   * @param unit
   * @return
   */
  public static Long getUntilTomorrowTime(Date currentTime, ChronoUnit unit) {
    //从一个 Instant和区域ID获得 LocalDateTime实例
    LocalDateTime localDateTime = LocalDateTime
            .ofInstant(currentTime.toInstant(), ZoneId.systemDefault());
    //获取第第二天零点时刻的实例
    LocalDateTime toromorrowTime = LocalDateTime
            .ofInstant(currentTime.toInstant(), ZoneId.systemDefault())
            .plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
    //ChronoUnit日期枚举类, between方法计算两个时间对象之间的时间量
    return unit.between(localDateTime, toromorrowTime);
  }
}
java
DateUtils.getUntilTomorrowTime(new Date(), ChronoUnit.SECONDS)