在对的最新更新中Java 语言(一种计算机语言,尤用于创建网站),String类经历了一系列重要的方法添加。某些方法现在产生Stream类的实例,而其中一些是高阶函数。合并这些方法的目的是提供一种以面向流的方式处理字符串的简化方法。
以面向流的方式处理字符串带来了简化代码和增强表现力的优势。这使得应用过滤、映射、缩小等操作变得更加容易。
另一个优点是流API启用并行处理,允许通过这些返回流的方法使用并行流。这使得利用多核处理器高效处理大型字符串成为可能。
本文深入研究了字符串类这使得处理能够以函数编程的方式进行。
chars():chars()方法通过返回IntStream来促进Java中有效的字符管理。这个IntStream表示一个整数值序列,每个值对应于所提供字符串中字符的Unicode码位。
码位是在Unicode标准中分配给字符的数字标识符,用于字符编码。
让我们通过一个例子来理解“chars()”。编写一个从字符串中删除给定字符的程序。让我们探索如何通过一种强制性的、非功能性的方法来应对这一挑战,避免使用chars()或流方法。
private static String removeChar(String input, char c){
StringBuilder sb = new StringBuilder();
char[] charArray = input.toCharArray();
for (char ch : charArray) {
if (ch != c) {
sb.append(ch);
}
}
return sb.toString();
}
让我们将其与功能方法进行比较:
private static String removeChar(String str, char c){
return str.chars()
.filter(ch -> ch != c)
.mapToObj(ch -> String.valueOf((char) ch))
.collect(Collectors.joining());
}
强制性的非函数式方法涉及使用StringBuilder对字符进行传统迭代以构建修改后的字符串。另一方面,函数式方法利用chars()方法和流API,提供了一种更简洁、更具表现力的解决方案。
transform():transform函数是一个高阶函数,它接受function作为参数。这转换函数提供了一种更简洁、更实用的方法来将转换应用于字符串。
transform函数可用于链接字符串中的转换。例如,考虑一个场景,您希望清理和格式化在表单中输入的用户输入。用户可能输入带有额外空格、混合大小写和不必要字符的姓名。可以使用字符串链接来标准化和清理该输入。
String userInput = " JoHN-dOe ";
String cleanedInput = userInput
.transform(String :: trim)
.transform(String :: toLowerCase)
.transform(user -> user.replaceAll("-", ""));
cleanedInput // johndoe
#行():lines函数返回从给定字符串中提取的行流,由行终止符(如\n、\r和\r\n)分隔。事实证明,Java字符串lines()方法比split()方法更具优势,因为它提供了惰性元素并且可以更快地检测行终止符。在字符串为空的情况下,lines函数返回零行。
String text = "The lines function returns a stream of lines extracted ,\nThe Java String lines() method proves advantageous ;\nIn cases where the string is empty,\n"
+ "the lines’ function returns zero lines.";
text.lines()
.map(String :: toUpperCase)
.filter(line -> line.contains("I"))
.forEach(System.out::println);
“text”字符串包含多行文本。我们使用lines()方法从文本中获取一串行。然后我们使用map操作将每一行转换成大写字母。应用筛选操作仅保留包含字母“I”的行,forEach操作打印修改后的行。
所解释的函数提供了一种强大而简洁的方法来处理字符串。它们通过利用流进行有效的操作和过滤提供了一种功能性方法,从而提高了不变性。将这些函数与其他流操作链接起来,可以实现复杂而简洁的转换,从而促进更干净、更具功能性的风格。