Groovy GDK-эквивалент Apache Commons StringUtils.capitalize(str) или расширенный Perl (str)

Да / нет-вопрос: есть ли в Groovy GDK-функция, чтобы заглавные буквы первого символа строки?

Я ищу Groovy эквивалент Perc's ucfirst (..) или Apache Commons StringUtils.capitalize (str) (последний использует заглавную букву всех слов во входной строке).

Я в настоящее время кодирую это вручную, используя..

str = str[0].toUpperCase() + str[1 .. str.size() - 1]

.. который работает, но я предполагаю, что есть более Groovy способ сделать это. Я мог бы представить, что ucfirst (..) является более распространенной операцией, чем скажем center (..), который является стандартным методом в Groovy GDK (см. http://groovy.codehaus.org/groovy-jdk/java/lang/String.html).

6 ответов

Решение

Нет, ничего не встроено прямо в язык.

Однако есть несколько более изящных способов сделать то, что вы просите (если вы не хотите использовать StringUtils идиоматическим способом Java, как предлагает Владимир).

Вы можете упростить свой метод, используя отрицательное значение во второй половине диапазона:

def str = "foo"

assert "Foo" == str[0].toUpperCase() + str[1..-1]

Или вы можете использовать статический импорт, чтобы он выглядел как собственный метод:

import static org.apache.commons.lang.StringUtils.*

assert "Foo" == capitalize("foo")

Вы также можете изменить метакласс, чтобы иметь все методы StringUtils прямо на нем, чтобы он выглядел как метод GDK:

import org.apache.commons.lang.StringUtils

String.metaClass.mixin StringUtils

assert "Foo" == "foo".capitalize()

Я не знаю ни одного такого метода, но обходной путь заключается в прямом использовании библиотеки Apache Commons в вашем коде Groovy:

import org.apache.commons.lang.StringUtils

def str = StringUtils.capitalize(input)

Это делает ваш Groovy-код немного в стиле Java (некоторым это может не понравиться), но это делает свою работу.

IMO большое преимущество Groovy в том, что вы можете очень легко использовать все библиотеки Java, которые вы обычно используете, с более традиционной базой Java-кода.

Чтобы сделать его доступным глобально в вашем приложении, просто инициализируйте этот блок при запуске

String.metaClass.capitalize = {делегат [0].toUpperCase()+ делегат [1..-1] }

Хорошо, вы можете попробовать это:

"hey this is a string".split(' ').collect{it.capitalize()}.join(' ')

или может быть это:

char c = ' ' "hey this is a string".collect{ c = c==' '?it.capitalize():it }.join()

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

def words = sentence.split(" ")
def newStr = []
words.each { w ->
    def capW = [w[0].toUpperCase()]
    if (w.length() > 1) {
        capW << w[1..-1].toLowerCase()
    }
    newStr << capW.join()
}
return newStr.join(' ')

По состоянию на Groovy 1.8.2 (выпущен еще в сентябре 2011 года), capitalize() является встроенным улучшением CharSequence который String реализует.

def str = "hello world"
str = str.capitalize()
assert "Hello world" == str
Другие вопросы по тегам