Инструменты Java, которые обычно используются для экономии 90% времени

Java
Инструменты Java, которые обычно используются для экономии 90% времени

«Эта статья участвовала в мероприятии Haowen Convocation Order, щелкните, чтобы просмотреть:Двойные заявки на внутреннюю и внешнюю стороны, призовой фонд в 20 000 юаней ждет вас, чтобы бросить вызов!"

предисловие

У вас есть лидер, который любит читать код, мой лидер любит читать код, который я пишу, и он любит обсуждать со мной, как писать лучшие, хахаха ... очень хорошо.

Сегодня давайте посмотрим на сторонние библиотеки с открытым исходным кодом, которые могут сэкономить 90% сверхурочных времен. Первый, кто представил, должен быть библиотекой Commons при Apache. Второй - это библиотека Guava, открытая в Google.

Apache Commons

Apache Commons — очень мощная и часто используемая библиотека. Он имеет около 40 библиотек классов, которые содержат операции со строками, датами, массивами и т. д.

Lang3

Lang3 - это пакет, который обрабатывает основные объекты в Java, таких как строка действия класса StringUtils, массив оператора класса Arrayutils, класс DateutiLs может обрабатывать дату, а класс MutablePair может вернуть несколько полей и многое другое.

Структура пакета:

image-20210719140346416

maven-зависимости

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
</dependency>

Манипуляции со строками

Для быстрых операций со строками записывайте меньше пустых условий в if else.

public static void main(String[] args) {
    boolean blank = StringUtils.isBlank(" ");//注意此处是null哦  这和isEmpty不一样的
    System.out.println(blank);

    boolean empty = StringUtils.isEmpty(" ");//注意这里是false
    System.out.println(empty);

    boolean anyBlank = StringUtils.isAnyBlank("a", " ", "c");// 其中一个是不是空字符串
    System.out.println(anyBlank);

    boolean numeric = StringUtils.isNumeric("1");//字符串是不是全是数字组成,"." 不算数字
    System.out.println(numeric);

    String remove = StringUtils.remove("abcdefgh", "a");//移除字符串
    System.out.println(remove);
}

Выходной результат:

true
false
true
true
bcdefgh

Process finished with exit code 0

манипулирование датой

Наконец, можно отформатировать дату без SimpleDateFormat, DateUtils.iterator может получить период времени.

public static void main(String[] args) throws ParseException {

    Date date = DateUtils.parseDate("2021-07-15", "yyyy-MM-dd");

    Date date1 = DateUtils.addDays(date, 1);//加一天
    System.out.println(date1);

    boolean sameDay = DateUtils.isSameDay(date, new Date());//比较
    System.out.println(sameDay);
    /*
        获取一段日期
        RANGE_WEEK_SUNDAY 从周日开始获取一周日期
        RANGE_WEEK_MONDAY 从周一开始获取一周日期
        RANGE_WEEK_RELATIVE 从当前时间开始获取一周日期
        RANGE_WEEK_CENTER 以当前日期为中心获取一周日期
        RANGE_MONTH_SUNDAY 从周日开始获取一个月日期
        RANGE_MONTH_MONDAY 从周一开始获取一个月日期
        */
    Iterator<Calendar> iterator = DateUtils.iterator(date, DateUtils.RANGE_WEEK_CENTER);
    while (iterator.hasNext()) {
        Calendar next = iterator.next();
        System.out.println(DateFormatUtils.format(next, "yyyy-MM-dd"));
    }
}

Выходной результат:

Fri Jul 16 00:00:00 CST 2021
false
2021-07-12
2021-07-13
2021-07-14
2021-07-15
2021-07-16
2021-07-17
2021-07-18

Process finished with exit code 0

вернуть несколько полей

Иногда, когда вам нужно вернуть несколько значений в методе, вы часто используете возврат HashMap или возврат JSON. Lang3 уже предоставил нам такой класс инструментов, поэтому нет необходимости писать больше HashMap и JSON.

public static void main(String[] args) {

    MutablePair<Integer, String> mutablePair = MutablePair.of(2, "这是两个值");
    System.out.println(mutablePair.getLeft() + "  " + mutablePair.getRight());

    MutableTriple<Integer, String, Date> mutableTriple = MutableTriple.of(2, "这是三个值", new Date());
    System.out.println(mutableTriple.getLeft() + " " + mutableTriple.getMiddle() + " " + mutableTriple.getRight());
}

Выходной результат:

2  这是两个值
2 这是三个值 Fri Jul 16 15:24:40 CST 2021

Process finished with exit code 0

ArrayUtils операции с массивами

ArrayUtils имеет дело с массивом специального класса, что позволяет легко обрабатывать массив вместо нужд различных циклов.

public static void main(String[] args) {

    //合并数组
    String[] array1 = new String[]{"value1", "value2"};
    String[] array2 = new String[]{"value3", "value4"};
    String[] array3 = ArrayUtils.addAll(array1, array2);
    System.out.println("array3:"+ArrayUtils.toString(array3));

    //clone 数组
    String[] array4 = ArrayUtils.clone(array3);
    System.out.println("array4:"+ArrayUtils.toString(array4));

    //数组是否相同
    boolean b = EqualsBuilder.reflectionEquals(array3, array4);
    System.out.println(b);

    //反转数组
    ArrayUtils.reverse(array4);
    System.out.println("array4反转后:"+ArrayUtils.toString(array4));

    //二维数组转 map
    Map<String, String> arrayMap = (HashMap) ArrayUtils.toMap(new String[][]{
        {"key1", "value1"}, {"key2", "value2"}
    });
    for (String s : arrayMap.keySet()) {
        System.out.println(arrayMap.get(s));
    }
}

Выходной результат:

array3:{value1,value2,value3,value4}
array4:{value1,value2,value3,value4}
true
array4反转后:{value4,value3,value2,value1}
value1
value2

Process finished with exit code 0

Операции перечисления EnumUtils

  • getEnum(Class enumClass, String enumName) возвращает перечисление по классам, возможно, пустое;
  • getEnumList(Class enumClass) возвращает коллекцию перечисления по классам;
  • getEnumMap(Class enumClass) возвращает карту перечисления по классам;
  • isValidEnum(Class enumClass, String enumName) Проверяет, входит ли enumName в перечисление, возвращает true или false.
public enum ImagesTypeEnum {
    JPG,JPEG,PNG,GIF;
}
    public static void main(String[] args) {
        ImagesTypeEnum imagesTypeEnum = EnumUtils.getEnum(ImagesTypeEnum.class, "JPG");
        System.out.println("imagesTypeEnum = " + imagesTypeEnum);
        System.out.println("--------------");
        List<ImagesTypeEnum> imagesTypeEnumList = EnumUtils.getEnumList(ImagesTypeEnum.class);
        imagesTypeEnumList.stream().forEach(
                imagesTypeEnum1 -> System.out.println("imagesTypeEnum1 = " + imagesTypeEnum1)
        );
        System.out.println("--------------");
        Map<String, ImagesTypeEnum> imagesTypeEnumMap = EnumUtils.getEnumMap(ImagesTypeEnum.class);
        imagesTypeEnumMap.forEach((k, v) -> System.out.println("key:" + k + ",value:" + v));
        System.out.println("-------------");
        boolean result = EnumUtils.isValidEnum(ImagesTypeEnum.class, "JPG");
        System.out.println("result = " + result);
        boolean result1 = EnumUtils.isValidEnum(ImagesTypeEnum.class, null);
        System.out.println("result1 = " + result1);
    }

Выходной результат:

imagesTypeEnum = JPG
--------------
imagesTypeEnum1 = JPG
imagesTypeEnum1 = JPEG
imagesTypeEnum1 = PNG
imagesTypeEnum1 = GIF
--------------
key:JPG,value:JPG
key:JPEG,value:JPEG
key:PNG,value:PNG
key:GIF,value:GIF
-------------
result = true
result1 = false

Process finished with exit code 0

коллекции4 операции над множествами

commons-collections4 расширяет структуру коллекций Java, предоставляя набор простых API для управления коллекциями.

maven-зависимости

 <dependency>  
    <groupId>org.apache.commons</groupId>  
    <artifactId>commons-collections4</artifactId>  
    <version>4.4</version>  
</dependency> 

Вспомогательный класс CollectionUtils

Это служебный класс, который может проверять, не добавлены ли нулевые элементы в набор, списки слияния, списки фильтров, объединение, различие и объединение двух списков. Некоторые функции могут быть заменены Stream API в Java 8.

public static void main(String[] args) {

    //null 元素不能加进去
    List<String> arrayList1 = new ArrayList<>();
    arrayList1.add("a");
    CollectionUtils.addIgnoreNull(arrayList1, null);
    System.out.println(arrayList1.size());

    //排好序的集合,合并后还是排序的
    List<String> arrayList2 = new ArrayList<>();
    arrayList2.add("a");
    arrayList2.add("b");

    List<String> arrayList3 = new ArrayList<>();
    arrayList3.add("c");
    arrayList3.add("d");
    System.out.println("arrayList3:" + arrayList3);

    List<String> arrayList4 = CollectionUtils.collate(arrayList2, arrayList3);
    System.out.println("arrayList4:" + arrayList4);

    //交集
    Collection<String> strings = CollectionUtils.retainAll(arrayList4, arrayList3);
    System.out.println("arrayList3和arrayList4的交集:" + strings);

    //并集
    Collection<String> union = CollectionUtils.union(arrayList4, arrayList3);
    System.out.println("arrayList3和arrayList4的并集:" + union);

    //差集
    Collection<String> subtract = CollectionUtils.subtract(arrayList4, arrayList3);
    System.out.println("arrayList3和arrayList4的差集:" + subtract);

    // 过滤,只保留 b
    CollectionUtils.filter(arrayList4, s -> s.equals("b"));
    System.out.println(arrayList4);
}

Выходной результат:

1
arrayList3:[c, d]
arrayList4:[a, b, c, d]
arrayList3和arrayList4的交集:[c, d]
arrayList3和arrayList4的并集:[a, b, c, d]
arrayList3和arrayList4的差集:[a, b]
[b]

Process finished with exit code 0

Статистика сумок

Используется для подсчета количества раз, когда значение появляется в коллекции.

public static void main(String[] args) {
    Bag bag = new HashBag<String>();
    bag.add("a");
    bag.add("b");
    bag.add("a");
    bag.add("c", 3);
    System.out.println(bag);
    System.out.println(bag.getCount("c"));
}

Выходной результат:

[2:a,1:b,3:c]
3

Process finished with exit code 0

beanutils Операции с компонентами

beanutils работает с JavaBeans посредством отражения. Например, Bean копируется, сопоставляется с объектом, а объект — с Map.

maven-зависимости

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.4</version>
</dependency>
public class User {
    
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
public static void main(String[] args) throws Exception {
    User user1 = new User();
    user1.setName("李四");
    User user2 = (User) BeanUtils.cloneBean(user1);
    System.out.println(user2.getName());

    //User 转 map
    Map<String, String> describe = BeanUtils.describe(user1);
    System.out.println(describe);

    //Map 转 User
    Map<String, String> beanMap = new HashMap();
    beanMap.put("name", "张三");
    User user3 = new User();
    BeanUtils.populate(user3, beanMap);
    System.out.println(user3.getName());
}

Выходной результат:

李四
{name=李四}
张三

Process finished with exit code 0

Guava

Проект расширения на основе Java с открытым исходным кодом от Google, включая некоторые основные инструменты, расширения коллекций, кэширование, набор инструментов параллелизма, обработку строк и т. д.

maven-зависимости

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>30.1.1-jre</version>
</dependency>

Карта Тип

В java-коде часто встречается, когда необходимо написать Map map локальные переменные. Иногда деловые ситуации немного сложнее.

public static void main(String[] args) {
    //以前
    Map<String, List<String>> map = new HashMap<>();
    List<String> list = new ArrayList<>();
    list.add("张三");
    list.add("李四");
    map.put("名称", list);
    System.out.println(map.get("名称"));

    //现在
    Multimap<String, String> multimap = ArrayListMultimap.create();
    multimap.put("名称", "张三");
    multimap.put("名称", "李四");
    System.out.println(multimap.get("名称"));
}

Выходной результат:

[张三, 李四]
[张三, 李四]

Process finished with exit code 0

Карта, значение которой не может быть повторено

Значение value в Map может повторяться, Java может создать Map, значение которого не повторяется, а Map и значение можно поменять местами.

public static void main(String[] args) {
    //会报异常
    BiMap<String ,String> biMap = HashBiMap.create();
    biMap.put("key1", "value");
    biMap.put("key2", "value");
    System.out.println(biMap.get("key1"));
}

Выходной результат:

Exception in thread "main" java.lang.IllegalArgumentException: value already present: value
	at com.google.common.collect.HashBiMap.put(HashBiMap.java:287)
	at com.google.common.collect.HashBiMap.put(HashBiMap.java:262)
	at org.example.clone.Test.main(Test.java:17)

Process finished with exit code 1
public static void main(String[] args) {
    BiMap<String ,String> biMap = HashBiMap.create();
    biMap.put("key1", "value1");
    biMap.put("key2", "value2");
    System.out.println(biMap.get("key1"));

    //key-value 对调
    biMap = biMap.inverse();
    System.out.println(biMap.get("value1"));
}

Выходной результат:

value1
key1

Process finished with exit code 0

Guava cache

При написании бизнеса вы обязательно будете использовать кеш.Когда вы не хотите использовать сторонний в качестве кеша, а Map недостаточно мощен, вы можете использовать кеш Guava.

Кэшированный уровень параллелизма

Guava предоставляет способ установить уровень параллелизмаAPI, чтобы кеш поддерживал одновременную запись и чтение. иConcurrentHashMapТочно так же параллелизм кеша Guava также достигается путем разделения блокировок. Как правило, рекомендуется устанавливать уровень параллелизма равным количеству ядер ЦП сервера.

CacheBuilder.newBuilder()
		// 设置并发级别为cpu核心数,默认为4
		.concurrencyLevel(Runtime.getRuntime().availableProcessors()) 
		.build();

Устанавливается начальный размер кеша

Когда мы создаем кеш к кэше, может установить разумный размер начальной емкости, из-за кэша с использованием механизма отдельного блокировки Guava, стоимость расширения очень дорого. Следовательно, разумная начальная мощность может уменьшить количество судна расширения кэша.

CacheBuilder.newBuilder()
		// 设置初始容量为100
		.initialCapacity(100)
		.build();

установить максимальное хранилище

Guava Cache может указать максимальное количество записей, которые может хранить кеш при построении объекта кеша. Когда количество записей в Cache достигает максимального значения, а затем вызывается метод put для добавления в него объектов, Guava сначала выберет одну из текущих кэшированных записей объекта для удаления, освобождения места, а затем сохранит новый объект в Cache. .

public static void main(String[] args) {
    Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(2).build();
    cache.put("key1", "value1");
    cache.put("key2", "value2");
    cache.put("key3", "value3");
    System.out.println(cache.getIfPresent("key1")); //key1 = null
}

Выходной результат:

null

Process finished with exit code 0

Дата истечения срока годности

expireAfterAccess() может установить время истечения срока действия кеша.

public static void main(String[] args) throws InterruptedException {
    //设置过期时间为2秒
    Cache<String, String> cache1 = CacheBuilder.newBuilder().maximumSize(2).expireAfterAccess(2, TimeUnit.SECONDS).build();
    cache1.put("key1", "value1");
    Thread.sleep(1000);
    System.out.println(cache1.getIfPresent("key1"));
    Thread.sleep(2000);
    System.out.println(cache1.getIfPresent("key1"));
}

Выходной результат:

value1
null

Process finished with exit code 0

LoadingCache

использовать пользовательскийClassLoaderЗагрузить данные в память. отLoadingCacheКогда данные получены из , если данные существуют, они будут возвращены напрямую;ClassLoaderизloadМетод загружает данные в память и возвращает данные.

public class Test {

    public static void main(String[] args) throws Exception {
        System.out.println(numCache.get(1));
        Thread.sleep(1000);
        System.out.println(numCache.get(1));
        Thread.sleep(1000);
        numCache.put(1, 6);
        System.out.println(numCache.get(1));

    }

    private static LoadingCache<Integer, Integer> numCache = CacheBuilder.newBuilder().
            expireAfterWrite(5L, TimeUnit.MINUTES).
            maximumSize(5000L).
            build(new CacheLoader<Integer, Integer>() {
                @Override
                public Integer load(Integer key) throws Exception {
                    System.out.println("no cache");
                    return key * 5;
                }
            });
}

Выходной результат:

no cache
5
5
6

Process finished with exit code 0

Суммировать

С помощью Apache Commons и Guava, двух сторонних библиотек инструментов с открытым исходным кодом, можно сократить код циклов и ifelse. Написанный код более надежен и может быть установлен перед новичками. Apache Commons и Guava имеют много классов инструментов, здесь указана лишь небольшая часть, вы можете увидеть различные варианты использования в примерах на официальном сайте.

Наконец

Я кодер, которого бьют, и я пытаюсь двигаться вперед. Если статья была вам полезна, не забудьте поставить лайк и подписаться, спасибо!