我已经用Java7编写了一些代码来操纵String。如果字符串大小> = 10,则将返回大小为10的子字符串,但如果大小<10,则将在字符串后附加0。我想知道是否有一种方法可以使用流和lambda在Java8中编写相同的代码。
有一些与Java8中的String操作有关的问题,但都没有解决我的问题。
String s = "12345678";
String s1 = s;
if(s.length() >= 10) {
s1 = s1.substring(0,10);
}
else {
for (int k = s.length() ; k < 10 ; k++) {
s1 = s1 + "0";
}
}
我希望输出字符串“ 1234567800”。
答案 0 :(得分:3)
这肯定不是Stream API的任务。如果您仍然想这样做,但最大程度地减少了可读性和性能损失,则可以使用
String s1 = IntStream.range(0, 10)
.map(i -> i<s.length()? s.charAt(i): '0')
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
直接的方法是
int cap = Math.min(s.length(), 10);
String s1 = s.substring(0, cap)+"0000000000".substring(cap);
或
int cap = Math.min(s.length(), 10);
String s1=new StringBuilder(10).append(s, 0, cap).append("0000000000", cap, 10).toString();
答案 1 :(得分:1)
您可以结合使用Stream::generate
,Collectors::collectingAndThen
和Collectors::joining
来获得一个单行解决方案,尽管它并不比these ones更好
public static String padd10(String str) {
return Stream.generate(() -> "0")
.limit(str.length() >= 10 ? 0 : 10 - str.length())
.collect(Collectors.collectingAndThen(
Collectors.joining(), str.substring(0, Math.min(str.length(), 10))::concat));
}
并调用它
System.out.println(padd10("123"));
System.out.println(padd10("1234567800"));
答案 2 :(得分:0)
如果您拥有Java 11,则可以使用新的String.repeat
方法。
只需找到您需要多少个int n = 10 - s.length();
,然后将其添加到s1 = s + "0".repeat(n);
在Java 8中,您可以使用流生成零
String zeros = Stream.generate(() -> "0").limit(n).collect(Collectors.joining());
s1 = s + zeros