Статьи

Apache Commons Lang StringUtils

Поэтому я подумал, что было бы хорошо поговорить о другой библиотеке Java, которая мне нравится. Это было вокруг некоторое время и, возможно, не самая захватывающая библиотека, но это очень и очень полезно. Я, вероятно, использую это ежедневно.

org.apache.commons.lang.StringUtils

StringUtils является частью Apache Commons Lang ( http://commons.apache.org/lang/ ), и, как следует из названия, он предоставляет несколько полезных утилит для работы со строками, выходящими за рамки того, что предлагается в java.lang.String . Он состоит из более чем 50 статических методов, и я не собираюсь описывать каждый из них, а просто набор методов, которые я использую наиболее эффективно.

Доступны две разные версии: новая org.apache.commons.lang3.StringUtils и старая org.apache.commons.lang.StringUtils . На самом деле между ними нет существенных различий. lang3.StringUtils требует Java 5.0 и, вероятно, является версией, которую вы хотите использовать.

public static логическое равно (CharSequence str1, CharSequence str2)

Думаю, я бы начал с одного из самых простых методов. равно Это делает в точности то, что вы ожидаете, принимает две строки и возвращает true, если они идентичны, или false, если они не идентичны.

Но у java.lang.String уже есть совершенно хороший метод equals? С какой стати я хочу использовать стороннюю реализацию?

Это честный вопрос. Давайте посмотрим на некоторый код, вы можете увидеть какие-либо проблемы?

1
2
3
4
5
public void doStuffWithString(String stringParam) {
    if(stringParam.equals("MyStringValue")) {
        // do stuff
    }
}

Это ожидание NullPointerException, которое должно произойти!

Есть несколько способов обойти это:

01
02
03
04
05
06
07
08
09
10
11
public void safeDoStuffWithString1(String stringParam) {
    if(stringParam != null && stringParam.equals("MyStringValue")) {
        // do stuff
    }
}
  
public void safeDoStuffWithString2(String stringParm) {
    if("MyStringValue".equals(stringParam)) {
        // do stuff
    }
}

Лично я не фанат обоих методов. Я думаю, что нулевые проверки загрязняют код, и для меня « MyStringValue» .equals (stringParam) просто плохо сканирует, выглядит неправильно.

Вот где StringUtils.equals пригодится, это абсолютно безопасно. Неважно, что вы передадите, NullPointer для вас не будет! Таким образом, вы можете переписать простой метод следующим образом:

1
2
3
4
5
public void safeDoStuffWithString3(String stringParam) {
    if(StringUtils.equals(stringParam,"MyStringValue)) {
        // do stuff
    }
}

Это личное предпочтение, но я думаю, что это читается лучше, чем первые два примера. С ними все в порядке, но я думаю, что StringUtils.equals () стоит рассмотреть.

isEmpty, isNotEmpty, isBlank, isNotBlank


Хорошо, они выглядят довольно само собой разумеющимся, я думаю, что они все абсолютно безопасны?

Вы, наверное, заметили здесь паттерн. isEmpty – это действительно нулевая безопасная замена для java.lang.String.isEmpty () , а isNotEmpty – обратная. Так что больше нет нулевых проверок:

1
2
3
4
5
6
7
if(myString != null && !myString.isEmpty()) { // urghh
   // Do stuff with myString
}
  
if(StringUtils.isNotEmpty(myString)) { // much nicer
   // Do stuff with myString
}

Итак, почему Пустой и Пустой?

Есть разница, isBlank также возвращает true, если строка содержит только пробел, т.е.

1
2
3
String someWhiteSpace = "    \t  \n";
StringUtils.isEmpty(someWhiteSpace); // false
StringUtils.isBlank(someWhiteSpace); // true

public static String [] split (String str, String separatorChars)

Правильно ли это выглядит как String.split (), так что это просто нулевая безопасная версия встроенного метода Java?

Ну, да, это, конечно, абсолютно безопасно. Попытка разбить пустую строку приводит к нулю, а нулевой разделитель разделяется на пробел. Но есть и другая причина, по которой вы должны рассмотреть возможность использования StringUtils.split (…) , и это тот факт, что java.lang.String.split принимает регулярное выражение в качестве разделителя. Например, следующее может не делать то, что вы хотите:

1
2
3
4
5
public void possiblyNotWhatYouWant() {
    String contrivedExampleString = "one.two.three.four";
    String[] result = contrivedExampleString.split(".");
    System.out.println(result.length); // 0
}

Но все, что мне нужно сделать, это поставить пару обратных слэшей перед «.» и это будет работать нормально. Это не имеет большого значения, не так ли?
Возможно, нет, но есть одно последнее преимущество использования StringUtils.split , и это тот факт, что регулярные выражения стоят дорого. Фактически, когда я тестировал разбиение строки на запятую (довольно распространенный случай использования в моем опыте), StingUtils.split работает в четыре раза быстрее!

public static String join (итерируемый итерируемый, разделитель строк)

Ах, наконец-то что-то действительно полезное!

На самом деле, я никогда не находил элегантный способ объединения строк с разделителем, всегда есть раздражающая условная необходимость проверить, хотите ли вы вставить разделитель или нет. Так что приятно, что для меня есть полезность. Вот быстрый пример:

1
2
String[] numbers = {"one", "two", "three"};
StringUtils.join(numbers,",");  // returns "one,two,three"

Существуют также различные перегруженные версии объединения, которые принимают массивы и итераторы.

Хорошо, я убежден. Это похоже на довольно полезную библиотеку, что еще она может сделать?
Довольно много, но, как я уже говорил ранее, я не буду беспокоиться о том, чтобы пройтись по каждому доступному методу, я просто закончу тем, что повторю то, что сказано в документации API. Я действительно рекомендую взглянуть поближе: http://commons.apache.org/lang/api-3.1/org/apache/commons/lang3/StringUtils.html

Поэтому, если вам когда-нибудь понадобится что-то сделать со строкой, которая не включена в базовую библиотеку Java String (и, возможно, даже с тем, что есть), взгляните на StringUtils.

Ссылка: Apache Commons Lang StringUtils от нашего партнера по JCG