2

我在 Java7 中编写了一些代码来操作字符串。如果字符串大小 >= 10,它将返回大小为 10 的子字符串,但如果大小小于 10,它将在字符串中附加 0。我想知道是否有办法使用流和 lambda 在 Java8 中编写相同的代码。

有一些与 Java8 中的字符串操作相关的问题,但它们都对我的问题没有帮助。

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”。

4

3 回答 3

4

这肯定不是 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();
于 2019-04-01T14:10:41.897 回答
1

您可以结合Stream::generate,Collectors::collectingAndThenCollectors::joining获得单线解决方案,尽管它并不比这些更好

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"));
于 2019-04-01T13:28:40.577 回答
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
于 2019-04-01T13:07:08.200 回答