Java 11:String中的新增功能

大家好! 自Java 11发布以来,已经过去了一天,现在该版本的第一批评论已经开始出现。 我将把我的小文章专门介绍给官方发行版的Invisible,因此,我失去了String类的关注更新,尤其是因为第11个Java官方文档中没有提到它(无论如何,我都没有找到有关它的信息)。

确实,如果我们查看String类,那么在我们熟悉的许多方法中,我们会发现一些标记为“ @since 11”的方法 。 是的,它们只是在昨天才正式出现在Java中。

当然,由于每个功能的用处都可能存在很大的疑问,因为最有用和必要的功能已经在Java的早期版本中编写,但是对于某些人来说可能会派上用场。 文章简短,但这不仅是我的错,也是Oracle的错-它们在发行版中仅包含4(+2)个方法,当然这还不够。

让我们开始吧。

条();


此方法删除第一个非空格之前和最后一个非空格之后的所有空格。 例如:

String withSpaces = " a "; String withoutSpaces = withSpaces.strip(); String OUTPUT_TEMPLATE = "<%s>" System.out.println(String.format(OUTPUT_TEMPLATE, withSpaces)); System.out.println(String.format(OUTPUT_TEMPLATE, withoutSpaces)); 

屏幕上显示的结果将是:

 original: < a > strip: <a> 

strip()方法有两个表亲-stripLeading()和stripTrailing()。 第一个-仅在第一个非空格之前删除前面的空格。 第二只落后。

 String leading = withSpaces.stripLeading(); String trailing = withSpaces.stripTrailing(); 

我们得到结果:

 stripLeading: <a > stripTrailing: < a> 

UPD


他们在这里的评论中建议,看到相同的trim()方法有本质上的相同,这不会有什么坏处。

我们看。 确实有区别。

 public static String trim(byte[] value) { int len = value.length; int st = 0; while ((st < len) && ((value[st] & 0xff) <= ' ')) { st++; } while ((st < len) && ((value[len - 1] & 0xff) <= ' ')) { len--; } return ((st > 0) || (len < value.length)) ? newString(value, st, len - st) : null; } 

如我们所见,在旧的实现中,使用两次迭代,首先计算第一个非空间的索引,然后计算最后一个非空间的索引,然后剪切新行并从该数据返回。 只是要消除差距,请注意这一点。

现在看一下strip()方法。

  public static String strip(byte[] value) { int left = indexOfNonWhitespace(value); if (left == value.length) { return ""; } int right = lastIndexOfNonWhitespace(value); return ((left > 0) || (right < value.length)) ? newString(value, left, right - left) : null; } public static int indexOfNonWhitespace(byte[] value) { int length = value.length; int left = 0; while (left < length) { char ch = (char)(value[left] & 0xff); if (ch != ' ' && ch != '\t' && !Character.isWhitespace(ch)) { break; } left++; } return left; } public static int lastIndexOfNonWhitespace(byte[] value) { int length = value.length; int right = length; while (0 < right) { char ch = (char)(value[right - 1] & 0xff); if (ch != ' ' && ch != '\t' && !Character.isWhitespace(ch)) { break; } right--; } return right; } 

新方法通常确定符号不可见,是否为空格,制表符等的所有情况。 (那些愿意的人可以进入isWhiteSpace实现的丛林)。

因此,如果不仅要修剪空格,而且要修剪所有不可见的字符,则最好使用新方法。

isBlank();


该方法是否返回该字符串是否为“空”的查询结果,除了空格,制表符和其他不可见字符外,不包含其他任何字符。

也就是说,如果我们执行以下代码:

 String blank = " "; Boolean isBlank = blank.isBlank(); 

结果将是:

 true 

在方法本身内部,有两种实现-拉丁字符和UTF-16编码的字符串。

  public boolean isBlank() { return indexOfNonWhitespace() == length(); } private int indexOfNonWhitespace() { if (isLatin1()) { return StringLatin1.indexOfNonWhitespace(value); } else { return StringUTF16.indexOfNonWhitespace(value); } } 

重复();


此方法将字符串的内容复制指定的次数,并在一行中返回结果。

例如,通过运行代码:

 String sample = "(^_^) "; String multiple = sample.repeat(10); 

我们会得到:

 (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) (^_^) 

如果迭代次数为零,则该字符串将根本不包含字符。

 String blank = sample.repeat(0); 

结果:

 length: 0 

行();


期望Oracle在不包含任何Stream API实现的情况下发布String更新会很奇怪。 并且它们确实在String类中包含了功能。

lines方法将一行的所有行转换为相应的Stream。 看起来像这样:

 String lines = "Blind Text Generator is a useful tool\n" + "which provides Lorem Ipsum and a number of alternatives.\n" + "The number of characters, words, and paragraphs\n" + "are easily controlled and you can set \n" + "the font to appreciate how it'll look in your design."; lines .lines() .map(l -> "next line: " + l) .forEach(System.out::println); 

我们得到结果:

 next line: Blind Text Generator is a useful tool next line: which provides Lorem Ipsum and a number of alternatives. next line: The number of characters, words, and paragraphs next line: are easily controlled and you can set next line: the font to appreciate how it'll look in your design. 

我们得到了一个完整的流,然后我们可以用它来完成通常使用普通流进行的所有操作。 此应用程序可能会非常不同,我希望开发人员会热烈地接受此功能。

如果您在方法本身内部查看,我们将看到将字符串转换为Stream的方式是使用两个拆分器,具体取决于字符串的编码。

 public Stream<String> lines() { return isLatin1() ? StringLatin1.lines(value) : StringUTF16.lines(value); } 

总结了String部分中的发行创新列表。 如果我错过了一些东西,我将很高兴知道并将其添加到评论中。 您可以在github上的资源中亲自感受到所有提供的代码示例

Source: https://habr.com/ru/post/zh-CN424539/


All Articles