GitHub 标星 1.3k+,一款超赞的用于字符串处理的 Java 8 库
1、《往期精选优秀博文都在这里了!》 2、阿里开源的27个项目,值得收藏! 3、花30分钟,用Jenkins部署码云上的SpringBoot项目 4、为了甩锅,我写了个牛逼的日志切面! 5、分布式锁用 Redis 还是 Zookeeper?
<groupId>
com.shekhargulati
</groupId><artifactId>
strman
</artifactId><version>
0.4.0
</version></dependency>
01、append
Strman.append(
"沉",
"默",
"王",
"二");
沉默王二
Strman.prepend(
"沉",
"默",
"王",
"二");
默王二沉
02、appendArray
String [] strs = {
"默",
"王",
"二"};
Strman.appendArray(
"沉",strs);
沉默王二
{
return
appendArray(value, appends);
}
Strman.append(
"沉",
"默",
"王",
"二");
Strman.append(
"沉",
newString[]{
"默",
"王",
"二"});
{
StringJoiner joiner =
new StringJoiner(
"");
for
(String append : appends) {
joiner.add(append);
}
return
value + joiner.toString();
}
{
this
(delimiter,
"",
"");
}
(CharSequence delimiter,
CharSequence prefix,
CharSequence suffix)
{
this
.prefix = prefix.toString();
this
.delimiter = delimiter.toString();
this
.suffix = suffix.toString();
}
03、at
Strman.at(
"沉默王二",
0);
Strman.at(
"沉默王二", -
1);
Strman.at(
"沉默王二",
4);
Optional[二]
Optional.empty
-(length-1)
到 (length-1)
之内的索引(当索引为负数的时候将从末尾开始查找),如果超出这个范围,将会返回 Optional.empty
,避免发生空指针。{
if
(isNullOrEmpty(value)) {
return
Optional.empty();
}
int
length = value.length();
if
(index <
0) {
index = length + index;
}
return
(index < length && index >=
0) ? Optional.of(String.valueOf(value.charAt(index))) : Optional.empty();
}
charAt()
方法查找的,但包裹了一层 Optional,就巧妙地躲开了烦人的空指针。04、between
String [] results = Strman.between(
"[沉默王二][一枚有趣的程序员]",
"[",
"]");
System.out.println(Arrays.toString(results));
[沉默王二, 一枚有趣的程序员]
String[] between(
final String value,
final String start,
final String end) {
String[] parts = value.split(end);
return
Arrays.stream(parts).map(subPart -> subPart.substring(subPart.indexOf(start) + start.length()))
.toArray(String[]::
new);
}
java.util.Arrays
类是为数组而生的专用工具类,基本上常见的对数组的操作,Arrays 类都考虑到了,stream()
方法可以将数组转换成流:String[] intro =
new String[] {
"沉",
"默",
"王",
"二" };
Arrays.stream(intro);
map()
方法可以把一个流中的元素转化成一个新流中的元素,它可以接收一个 Lambda 表达式作为参数。Lambda 表达式描述了一个代码块(或者叫匿名方法),可以将其作为参数传递给构造方法或者普通方法以便后续执行。() -> System.out.println(
"沉默王二")
()
为 Lambda 表达式的参数列表(本例中没有参数),->
标识这串代码为 Lambda 表达式(也就是说,看到 ->
就知道这是 Lambda),System.out.println("沉默王二")
为要执行的代码,即将“沉默王二”打印到标准输出流。toArray()
方法可以将流转换成数组,你可能比较好奇的是 String[]::new
,它是什么东东呢?来看一下 toArray()
方法的源码。<A> A[] toArray(IntFunction<A[]> generator);
String[]::new
是一个 IntFunction,一个可以产生所需的新数组的函数,可以通过反编译字节码看看它到底是什么:String[] strArray =
(String[])list.stream().toArray((x$0) -> {
returnnew
String[x$
0];
});
05、chars
String [] results = Strman.chars(
"沉默王二");
System.out.println(Arrays.toString(results));
[沉, 默, 王, 二]
String[] chars(
final String value) {
return
value.split(
"");
}
split()
方法实现的。06、charsCount
Map<Character, Long> map = Strman.charsCount(
"沉默王二的妹妹叫沉默王三");
System.out.println(map);
{的=1, 默=2, 三=1, 妹=2, 沉=2, 叫=1, 王=2, 二=1}
{
return
input.chars().mapToObj(c -> (
char) c).collect(groupingBy(identity(), counting()));
}
chars()
方法是 Java 9 新增的,它返回一个针对基本类型 int 的流:IntStream。mapToObj()
方法主要是将 Stream 中的元素进行装箱操作, 转换成一个引用类型的值, 它接收一个 IntFunction 接口, 它是一个 int -> R
的函数接口。collect()
方法可以把流转成集合 Map。07、collapseWhitespace
Strman.collapseWhitespace(
"沉默王二 一枚有趣的程序员");
.collapseWhitespace(
"沉默王二 一枚有趣的程序员")
{
return
value.trim().replaceAll(
"\\s\\s+",
" ");
}
trim()
方法去掉两侧的空格,然后再用正则表达式将多个连续的空格替换成单个空格。08、contains
System.out.println(Strman.contains(
"沉默王二",
"沉"));
System.out.println(Strman.contains(
"Abbc",
"a",
false));
true
{
if
(caseSensitive) {
return
value.contains(needle);
}
return
value.toLowerCase().contains(needle.toLowerCase());
}
contains()
方法实现,如果不区分大小写,则先调用 toLowerCase()
方法转成小写。09、containsAny
System.out.println(Strman.containsAny(
"沉默王二",
new String [] {
"沉",
"三"}));
System.out.println(Strman.containsAny(
"沉默王二",
new String [] {
"沉默",
"三"}));
System.out.println(Strman.containsAny(
"沉默王二",
new String [] {
"不",
"三"}));
true
false
{
return
Arrays.stream(needles).anyMatch(needle -> contains(value, needle, caseSensitive));
}
anyMatch()
,只要有一个元素匹配传入的条件,就返回 true。allMatch()
,只有有一个元素不匹配传入的条件,就返回 false;如果全部匹配,则返回 true。noneMatch()
,只要有一个元素匹配传入的条件,就返回 false;如果全部匹配,则返回 true。
10、endsWith
System.out.println(Strman.endsWith(
"沉默王二",
"二"));
System.out.println(Strman.endsWith(
"Abbc",
"A",
false));
false
(
final String value,
final String search,
finalint position,
finalboolean
caseSensitive)
{
int
remainingLength = position - search.length();
if
(caseSensitive) {
return
value.indexOf(search, remainingLength) > -
1;
}
return
value.toLowerCase().indexOf(search.toLowerCase(), remainingLength) > -
1;
}
indexOf()
方法实现。11、ensureLeft
System.out.println(Strman.ensureLeft(
"沉默王二",
"沉"));
System.out.println(Strman.ensureLeft(
"默王二",
"沉"));
沉默王二
沉默王二
{
if
(caseSensitive) {
return
value.startsWith(prefix) ? value : prefix + value;
}
String _value = value.toLowerCase();
String _prefix = prefix.toLowerCase();
return
_value.startsWith(_prefix) ? value : prefix + value;
}
startsWith()
方法先进行判断,如果结果为 false,则通过“+”操作符进行连接。12、base64Encode
Strman.base64Encode(
"沉默王二");
5rKJ6buY546L5LqM
{
return
Base64.getEncoder().encodeToString(value.getBytes(StandardCharsets.UTF_8));
}
Strman.base64Decode(
"5rKJ6buY546L5LqM")
Exception
in thread
"main" java.lang.
IllegalArgumentException: Last unit does
not have enough valid bits
at java.base/java.util.Base64$Decoder.decode
0(Base64.
java:763)
at java.base/java.util.Base64$Decoder.decode(Base64.
java:535)
at java.base/java.util.Base64$Decoder.decode(Base64.
java:558)
at strman.Strman.base64Decode(Strman.
java:328)
at com.itwanger.strman.Demo.main(Demo.
java:58)
13、binEncode
Strman.binEncode(
"沉默王二");
0110110010001001100111101101100001110011100010110100111010001100
Strman.binDecode(
"0110110010001001100111101101100001110011100010110100111010001100");
14、first
System.out.println(Strman.first(
"沉默王二",
0));
System.out.println(Strman.first(
"沉默王二",
1));
System.out.println(Strman.first(
"沉默王二",
2));
Optional[沉]
Optional[沉默]
Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
begin0,
end-1,
length4at
java.base/java.lang.String.checkBoundsBeginEnd(String.java:
3319)
at
java.base/java.lang.String.substring(String.java:
1874)
at
strman.Strman.lambda$
first$
9(Strman.java:
414)
at
java.base/java.util.Optional.map(Optional.java:
265)
at
strman.Strman.first(Strman.java:
414)
at
com.itwanger.strman.Demo.main(Demo.java:
68)
{
return
Optional.ofNullable(value).filter(v -> !v.isEmpty()).map(v -> v.substring(
0, n));
}
substring()
方法实现的,不过没有针对 n 小于 0 的情况做处理。ofNullable()
方法可以创建一个即可空又可非空的 Optional 对象。filter()
方法的参数类型为 Predicate(Java 8 新增的一个函数式接口),也就是说可以将一个 Lambda 表达式传递给该方法作为条件,如果表达式的结果为 false,则返回一个 EMPTY 的 Optional 对象,否则返回过滤后的 Optional 对象。map()
方法可以按照一定的规则将原有 Optional 对象转换为一个新的 Optional 对象,原有的 Optional 对象不会更改。15、head
Strman.head(
"沉默王二");
{
return
first(value,
1);
}
first()
方法实现的,只不过 N 为 1。16、unequal
Strman.unequal(
"沉默王二",
"沉默王三");
true
{
return
!Objects.equals(first, second);
}
Objects.equals()
方法进行判断的,由于 String 类重写了 equals()
方法,也就是说,实际上还是通过 String 类的 equals()
方法进行判断的。17、insert
Strman.insert(
"沉默二",
"王",
2);
沉默王二
{
if
(index > value.length()) {
return
value;
}
return
append(value.substring(
0, index), substr, value.substring(index));
}
append()
方法将指定字符串插入到对应索引处。18、repeat
Strman.repeat(
"沉默王二",
3);
沉默王二沉默王二沉默王二
{
return
Stream.generate(() -> value).limit(multiplier).collect(joining());
}
Stream.generate()
生成的 Stream,默认是串行(相对 parallel 而言)但无序的(相对 ordered 而言)。由于它是无限的,在管道中,必须利用 limit 之类的操作限制 Stream 大小。collect(joining())
可以将流转成字符串。19、leftPad
Strman.leftPad(
"王二",
"沉默",
6);
沉默沉默沉默沉默王二
{
if
(value.length() > length) {
return
value;
}
return
append(repeat(pad, length - value.length()), value);
}
repeat()
方法进行补位,然后再调用 append()
方法拼接。String [] results = Strman.removeEmptyStrings(
new String[]{
"沉",
" ",
" ",
"默王二"});
System.out.println(Arrays.toString(results));
[沉, 默王二]
String[] removeEmptyStrings(String[] strings) {
if
(Objects.isNull(strings)) {
thrownew
IllegalArgumentException(
"Input array should not be null");
}
return
Arrays.stream(strings).filter(str -> str !=
null && !str.trim().isEmpty()).toArray(String[]::
new);
}
filter()
方法过滤掉了空格。20、reverse
Strman.reverse(
"沉默王二");
二王默沉
{
returnnew
StringBuilder(value).reverse().toString();
}
StringBuilder
类的 reverse()
方法进行反转的。21、safeTruncate
Strman.safeTruncate(
"Java is the best",
13,
"...");
Java
is...
{
if
(length ==
0) {
return""
;
}
if
(length >= value.length()) {
return
value;
}
String[] words = words(value);
StringJoiner result =
new StringJoiner(
" ");
int
spaceCount =
0;
for
(String word : words) {
if
(result.length() + word.length() + filler.length() + spaceCount > length) {
break
;
}
else {
result.add(word);
spaceCount++;
}
}
return
append(result.toString(), filler);
}
words()
方法对字符串进行单词分割,然后按照长度进行截断,最后调用 append()
方法填充上补位符。Strman.truncate(
"Java is the best",
13,
"...")
Java
is th...
{
if
(length ==
0) {
return""
;
}
if
(length >= value.length()) {
return
value;
}
return
append(value.substring(
0, length - filler.length()), filler);
}
22、shuffle
Strman.shuffle(
"沉默王二");
王默二沉
{
String[] chars = chars(value);
Random random =
new Random();
for
(
int i =
0; i < chars.length; i++) {
int
r = random.nextInt(chars.length);
String tmp = chars[i];
chars[i] = chars[r];
chars[r] = tmp;
}
return
Arrays.stream(chars).collect(joining());
}
chars()
方法把字符串拆分为字符串数组,然后遍历对其重排,最后通过 Stream 转成新的字符串。23、其他方法
https://github.com/shekhargulati/strman-java/wiki
1、为了甩锅,我写了个牛逼的日志切面! 2、记一次 mysql 磁盘满解决过程 3、排名前 16 的 Java 工具类,哪个你没用过? 4、垃圾代码和优质代码的区别? 5、工作群里常见表情的真正含义…… 6、把我坑惨的一个MySQL双引号! 7、基于Spring+SpringMVC+Mybatis的分布式敏捷开发系统架构 8、分享5个免费的在线 SQL 数据库环境,简直太方便了! 9、SQL 优化极简法则,你掌握了几个? 10、高并发下的接口幂等性解决方案! 关注公众号,你想要的Java都在这里
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。