以后我準備告別String.format()了,因為它不夠香!
開發(fā)環(huán)境
JDK - 17
Slf4j - 2.0.7
前言
作為一名合格的Java開發(fā)者,字符串格式化最常見的方式,莫過于使用String.format
來完成工作中想要的格式化效果。但是,字符串中使用%s
占位符,它真的不太顯眼。
我個人來講,使用最多的場景就是英文和中文的格式化操作,內(nèi)容中間突然來個%s
占位符,我有時候真的找不到它!就比如這(還不算痛苦):String.format("Resolve all today's questions %s, using String.format. ", "slf4j");
某天我偶然好奇,天天在程序中打Log日志,使用的{}
分隔符就很爽??!我應該也可以直接用!果然,slf4j-api
的包中,提供了非常好的格式化類org.slf4j.helpers.MessageFormatter
。
注意,千萬別用錯類了,因為JDK中有個
java.text.MessageFormat
類,使用方式可大不相同。
Pom引用
xml復制代碼<dependency> ?? ?<groupId>org.slf4j</groupId> ?? ?<artifactId>slf4j-api</artifactId> ?? ?<version>2.0.7</version> </dependency>
簡單使用
想要使用一個類,最快的方式就是先看它的注釋,大概率都有示例和詳細說明。當我們進入MessageFormatter
類中之后,可以看到幾個比較突出、簡單的小示例以及說明。符號{}
在類中的描述為"錨點",用于參數(shù)的占位符。
1. 簡單替換
通過簡單的替換規(guī)則,完成1個或多個參數(shù)的替換,已經(jīng)能滿足日常大部分場景的使用了!
java復制代碼MessageFormatter.format("Hi {}.", "there").getMessage();
erlang復制代碼輸出:Hi there.
2. 不生效的{1,2,3}
占位符
平時可能拼接的字符串帶{}
符號,比如:{1,2,3}
字符串且中間有字母,其實可以直接讓占位符無效。
java復制代碼MessageFormatter.format("Set {1,2,3} is not equal to {}.", "1,2").getMessage();
vbnet復制代碼輸出:Set {1,2,3} is not equal to 1,2.
3. 純粹的輸出{}
符號
通過反斜杠來轉(zhuǎn)義,輕松輸出{}
符號
java復制代碼MessageFormatter.format("Set \\{} is not equal to {}.", "1,2").getMessage();
vbnet復制代碼輸出:Set {} is not equal to 1,2.
4. Windows上拼接磁盤注意看
Window系統(tǒng)中日常拼接路徑本身就帶\\
轉(zhuǎn)義符,如果需要讓占位符{}
生效,需要再轉(zhuǎn)一次!
java復制代碼MessageFormatter.format("File name is C:\\\\{}.", "file.zip").getMessage();
python復制代碼輸出:File name is C:\file.zip.
不過日常使用,使用MessageFormatter.format("xxx {} xxx", "file.zip").getMessage();
這一大串,還是太長了。
縮短一點
通過MessageFormatter.basicArrayFormat(format, args);
方法,完成第一步的縮短操作。這個方法可以說是對上面長方法的簡單封裝。
java復制代碼final public static String basicArrayFormat(final String messagePattern, final Object[] argArray) { ?? ?FormattingTuple ft = arrayFormat(messagePattern, argArray, null); ?? ?return ft.getMessage(); }
再短一點呢!
再短就只能自己來了!搞個Strings
類,自己想咋地就咋地。
java復制代碼public class Slf4jDemo { ?? ?public static void main(String[] args) { ?? ? ? ?Strings.format("hello %s", "world"); ?? ?} ? ?? ?public static class Strings { ?? ? ? ?public static String format(String format, Object... args) { ?? ? ? ? ? ?return MessageFormatter.basicArrayFormat(format, args); ?? ? ? ?} ?? ?} }
效果更佳
如果是習慣使用Kotlin
編寫代碼的小伙伴,可以直接把它作為字符串的擴展方法來使用的。那叫一個爽??!
kotlin復制代碼//擴展字符串類型 fun String.format(vararg args: Any): String { ?? ?return MessageFormatter.basicArrayFormat(this, args) } ?fun main() { ?? ?//直接用 ?? ?println("hello {}".format("world")) }
總結(jié)
有了Slf4j的MessageFormatter
類,我個人目前已經(jīng)對String.format
放棄了。當然,有些小伙伴已經(jīng)習慣了String.format
的使用,那就接著用。技術(shù)方案沒有最好的,只有最適合自己的!加班寫代碼已經(jīng)夠苦了,平時還不怎么爽怎么來!