GitHub 上 1,附答案解析

}

java.util.Arrays 类是为数组而生的专用工具类,基本上常见的对数组的操作,Arrays 类都考虑到了,stream() 方法可以将数组转换成流:

String[] intro = new String[] { “沉”, “默”, “王”, “二” };

Arrays.stream(intro);

Java 8 新增的 Stream 流在很大程度上提高了开发人员在操作集合(Collection)时的生产力。要想操作流,首先需要有一个数据源,可以是数组或者集合。每次操作都会返回一个新的流对象,方便进行链式操作,但原有的流对象会保持不变。

map() 方法可以把一个流中的元素转化成一个新流中的元素,它可以接收一个 Lambda 表达式作为参数。Lambda 表达式描述了一个代码块(或者叫匿名方法),可以将其作为参数传递给构造方法或者普通方法以便后续执行。

考虑下面这段代码:

() -> System.out.println(“沉默王二”)

来从左到右解释一下,() 为 Lambda 表达式的参数列表(本例中没有参数),-> 标识这串代码为 Lambda 表达式(也就是说,看到 -> 就知道这是 Lambda),System.out.println("沉默王二") 为要执行的代码,即将“沉默王二”打印到标准输出流。

toArray() 方法可以将流转换成数组,你可能比较好奇的是 String[]::new,它是什么东东呢?来看一下 toArray() 方法的源码。

A[] toArray(IntFunction<A[]> generator);

也就是说 String[]::new 是一个 IntFunction,一个可以产生所需的新数组的函数,可以通过反编译字节码看看它到底是什么:

String[] strArray = (String[])list.stream().toArray((x$0) -> {

return new String[x$0];

});

也就是相当于返回了一个指定长度的字符串数组。

05、chars

返回组成字符串的单个字符的数组。

String [] results = Strman.chars(“沉默王二”);

System.out.println(Arrays.toString(results));

结果如下所示:

[沉, 默, 王, 二]

来看一下源码:

public static String[] chars(final String value) {

return value.split(“”);

}

内部是通过 String 类的 split() 方法实现的。

06、charsCount

统计字符串中每个字符出现的次数。

Map<Character, Long> map = Strman.charsCount(“沉默王二的妹妹叫沉默王三”);

System.out.println(map);

结果如下所示:

{的=1, 默=2, 三=1, 妹=2, 沉=2, 叫=1, 王=2, 二=1}

是不是瞬间觉得这个方法有意思多了,一步到位,统计出字符串中各个字符出现的次数,来看一下源码吧。

public static Map<Character, Long> charsCount(String input) {

return input.chars().mapToObj(c -> (char) c).collect(groupingBy(identity(), counting()));

}

String 类的 chars() 方法是 Java 9 新增的,它返回一个针对基本类型 int 的流:IntStream。

mapToObj() 方法主要是将 Stream 中的元素进行装箱操作, 转换成一个引用类型的值, 它接收一个 IntFunction 接口, 它是一个 int -> R 的函数接口。

collect() 方法可以把流转成集合 Map。

07、collapseWhitespace

用单个空格替换掉多个连续的空格。

Strman.collapseWhitespace(“沉默王二 一枚有趣的程序员”);

结果如下所示:

Strman.collapseWhitespace(“沉默王二 一枚有趣的程序员”)

来看一下源码:

public static String collapseWhitespace(final String value) {

return value.trim().replaceAll(“\s\s+”, " ");

}

内部先用 trim() 方法去掉两侧的空格,然后再用正则表达式将多个连续的空格替换成单个空格。

08、contains

验证指定的字符串是否包含某个字符串。

System.out.println(Strman.contains(“沉默王二”, “沉”));

System.out.println(Strman.contains(“Abbc”, “a”, false));

结果如下所示:

true

true

第三个参数 caseSensitive 是可选项,如果为 false 则表明不区分大小写。

来看一下源码:

public static boolean contains(final String value, final String needle, final boolean caseSensitive) {

if (caseSensitive) {

return value.contains(needle);

}

return value.toLowerCase().contains(needle.toLowerCase());

}

内部通过 String 类的 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

true

false

来看一下源码:

public static boolean containsAny(final String value, final String[] needles, final boolean caseSensitive) {

return Arrays.stream(needles).anyMatch(needle -> contains(value, needle, caseSensitive));

}

Stream 类提供了三个方法可供进行元素匹配,它们分别是:

  • anyMatch(),只要有一个元素匹配传入的条件,就返回 true。

  • allMatch(),只有有一个元素不匹配传入的条件,就返回 false;如果全部匹配,则返回 true。

  • noneMatch(),只要有一个元素匹配传入的条件,就返回 false;如果全部匹配,则返回 true。

10、endsWith

验证字符串是否以某个字符串结尾。

System.out.println(Strman.endsWith(“沉默王二”,“二”));

System.out.println(Strman.endsWith(“Abbc”, “A”, false));

结果如下所示:

true

false

来看一下源码:

public static boolean endsWith(final String value, final String search, final int position,

final boolean caseSensitive) {

int remainingLength = position - search.length();

if (caseSensitive) {

return value.indexOf(search, remainingLength) > -1;

}

return value.toLowerCase().indexOf(search.toLowerCase(), remainingLength) > -1;

}

内部通过 String 类的 indexOf() 方法实现。

11、ensureLeft

确保字符串以某个字符串开头,如果该字符串没有以指定的字符串开头,则追加上去。

System.out.println(Strman.ensureLeft(“沉默王二”, “沉”));

System.out.println(Strman.ensureLeft(“默王二”, “沉”));

结果如下所示:

沉默王二

沉默王二

来看一下源码:

public static String ensureLeft(final String value, final String prefix, final boolean caseSensitive) {

if (caseSensitive) {

return value.startsWith(prefix) ? value : prefix + value;

}

String _value = value.toLowerCase();

String _prefix = prefix.toLowerCase();

return _value.startsWith(_prefix) ? value : prefix + value;

}

内部通过 String 类的 startsWith() 方法先进行判断,如果结果为 false,则通过“+”操作符进行连接。

ensureLeft 对应的还有 ensureRight,同理,这里不再赘述。

12、base64Encode

把字符串进行 base64 编码。

Strman.base64Encode(“沉默王二”);

结果如下所示:

5rKJ6buY546L5LqM

Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。来看一下源码:

public static String base64Encode(final String value) {

return Base64.getEncoder().encodeToString(value.getBytes(StandardCharsets.UTF_8));

}

内部是通过 Base64 类实现的,Java 8 新增的一个类。

base64Encode 对应的解码方法是 base64Decode,使用方法如下所示:

Strman.base64Decode(“5rKJ6buY546L5LqM”)

如果不可解码的会,会抛出 IllegalArgumentException 异常。

Exception in thread “main” java.lang.IllegalArgumentException: Last unit does not have enough valid bits

at java.base/java.util.Base64$Decoder.decode0(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

把字符串转成二进制的 Unicode(16 位)。

Strman.binEncode(“沉默王二”);

结果如下所示:

0110110010001001100111101101100001110011100010110100111010001100

binEncode 对应的方法是 binDecode,把二进制的 Unicode 转成字符串,使用方法如下所示:

Strman.binDecode(“0110110010001001100111101101100001110011100010110100111010001100”);

14、first

返回字符串的前 N 个字符。

System.out.println(Strman.first(“沉默王二”, 0));

System.out.println(Strman.first(“沉默王二”, 1));

System.out.println(Strman.first(“沉默王二”, 2));

结果如下所示:

Optional[]

Optional[沉]

Optional[沉默]

如果 N 为负数的话,将会抛出 StringIndexOutOfBoundsException 异常:

Exception in thread “main” java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 4

at 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)

针对 N 为负数的情况,我觉得没有之前的 at 方法处理的巧妙。

来看一下源码:

public static Optional first(final String value, final int n) {

return Optional.ofNullable(value).filter(v -> !v.isEmpty()).map(v -> v.substring(0, n));

}

内部是通过 String 类的 substring() 方法实现的,不过没有针对 n 小于 0 的情况做处理。

ofNullable() 方法可以创建一个即可空又可非空的 Optional 对象。

filter() 方法的参数类型为 Predicate(Java 8 新增的一个函数式接口),也就是说可以将一个 Lambda 表达式传递给该方法作为条件,如果表达式的结果为 false,则返回一个 EMPTY 的 Optional 对象,否则返回过滤后的 Optional 对象。

map() 方法可以按照一定的规则将原有 Optional 对象转换为一个新的 Optional 对象,原有的 Optional 对象不会更改。

first 对应的的是 last 方法,返回字符串的后 N 个字符。

15、head

返回字符串的第一个字符。

Strman.head(“沉默王二”);

结果如下所示:

Optional[沉]

来看一下源码:

public static Optional head(final String value) {

return first(value, 1);

}

内部是通过调用 first() 方法实现的,只不过 N 为 1。

16、unequal

检查两个字符串是否不等。

Strman.unequal(“沉默王二”,“沉默王三”);

结果如下所示:

true

来看一下源码:

public static boolean unequal(final String first, final String second) {

return !Objects.equals(first, second);

}

内部是通过 Objects.equals() 方法进行判断的,由于 String 类重写了 equals() 方法,也就是说,实际上还是通过 String 类的 equals() 方法进行判断的。

17、insert

把字符串插入到指定索引处。

Strman.insert(“沉默二”,“王”,2);

结果如下所示:

沉默王二

来看一下源码:

public static String insert(final String value, final String substr, final int index) {

if (index > value.length()) {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典

  • Java核心知识整理

2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多

Java核心知识

  • Spring全家桶(实战系列)

2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多

  • 其他电子书资料

2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多

Step3:刷题

既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

以下是我私藏的面试题库:

2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多
,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
[外链图片转存中…(img-IOPzZAJY-1711739166034)]
[外链图片转存中…(img-I7VHduBF-1711739166035)]
[外链图片转存中…(img-MjegLZ5h-1711739166035)]
[外链图片转存中…(img-BwQwfecd-1711739166036)]
[外链图片转存中…(img-tVNtEaIO-1711739166036)]
[外链图片转存中…(img-CNiJl1XK-1711739166037)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-zGcbuJcy-1711739166037)]

最后

面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典

  • Java核心知识整理

[外链图片转存中…(img-AlKGfmtY-1711739166038)]

Java核心知识

  • Spring全家桶(实战系列)

[外链图片转存中…(img-jWLT8j6a-1711739166038)]

  • 其他电子书资料

[外链图片转存中…(img-A7fe5lIW-1711739166039)]

Step3:刷题

既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

以下是我私藏的面试题库:

[外链图片转存中…(img-wEjbWxhC-1711739166039)]

  • 23
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值