当前位置: 首页 > 知识库问答 >
问题:

Java 8用Lambda将整数转换成字符串

牧宁
2023-03-14

我试图创建一个函数,它返回一个随机的字母字符字符串,但我试图使用lambdas来做到这一点,我的函数看起来像:

public static String nextString() {
  return IntStream.range(0, 10).map(i -> getRandomChar()).XXX
}

private static Character getRandomChar() {
  //returns a random Character object
}

我不知道在XXX上设置什么。

我以类似的方式解决了这个问题,方法是:

public static String nextString() {
    StringBuilder randomString = new StringBuilder();
    IntStream.range(0, stringLenght).forEach(i -> randomString.append(getRandomChar()));
    return randomString.toString();
}

但是我宁愿不要在每次使用该方法时都创建一个新的StringBuilder,并为简单的方法保留状态和变量。

共有2个答案

越高峻
2023-03-14

目前尚不清楚getRandomChar()做了什么,值得围绕它构建另一个Stream操作。首先,通过随机值进行流式传输要简单得多。

例如,以下代码生成由 A-Z 范围内大写字母组成的随机字符串:

public static String nextString() {
    return ThreadLocalRandom.current().ints(stringLength, 'A', 'Z'+1)
        .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
        .toString();
}

如果预期的字符没有形成连续的范围,可以使用字符串常量来命名允许的字符,例如

public static String nextString() {
    String allowed = "XO+";
    return ThreadLocalRandom.current().ints(stringLength, 0, allowed.length())
        .map(allowed::charAt)
        .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
        .toString();
}

当然,这个收集器不会像< code > collectors . joining()那样隐藏< code>StringBuilder,但是另一方面,这个操作没有装箱开销,也不会创建临时字符串。

您可以使用类似的操作来构建字符池< code>String:

static final String ASCII_LETTERS_AND_NUMBERS =
        IntStream.concat(IntStream.concat(
            IntStream.rangeClosed('A', 'Z'), IntStream.rangeClosed('a', 'z')),
            IntStream.rangeClosed('0', '9'))
        .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
        .toString();
public static String nextString() {
    return ThreadLocalRandom.current()
        .ints(stringLength, 0, ASCII_LETTERS_AND_NUMBERS.length())
        .map(ASCII_LETTERS_AND_NUMBERS::charAt)
        .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
        .toString();
}

或者,挑战随机字符串的读者:

static final String ALL_LETTERS_AND_NUMBERS =
    IntStream.rangeClosed(32, Character.MAX_VALUE)
        .filter(Character::isLetterOrDigit)
        .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
        .toString();
public static String nextString() {
    return ThreadLocalRandom.current()
        .ints(stringLength, 0, ALL_LETTERS_AND_NUMBERS.length())
        .map(ALL_LETTERS_AND_NUMBERS::charAt)
        .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
        .toString();
}
郭单鹗
2023-03-14

像这样:

public static String nextString() {
    return IntStream.range(0, 10).boxed().map(i -> getRandomChar(i)).collect(Collectors.joining());
}

private static String getRandomChar(int i) {
    return String.valueOf((char)i);
}
 类似资料:
  • 题目链接 NowCoder 题目描述 将一个字符串转换成一个整数,字符串不是一个合法的数值则返回 0,要求不能使用字符串转换整数的库函数。 // html Iuput: +2147483647 1a33 Output: 2147483647 0 解题思路 // java public int StrToInt(String str) { if (str == null || str.l

  • 问题内容: 如何在JavaScript中将字符串转换为整数? 问题答案: 最简单的方法是使用本机函数: 如果这对您不起作用,则有 parseInt , 一元加号 , 带有floor的parseFloat 和 Math.round 方法。 parseInt: 一元加号,如果您的字符串已经是整数形式: 如果您的字符串是浮点数或可能是浮点数,并且您想要一个整数: 或者,如果您要多次使用Math.floo

  • 问题内容: 有什么方法可以将null转换为Integer。null实际上是一个字符串,我在我的服务层中传递该字符串,将其接受为整数。因此,每当我尝试将null字符串强制转换为Integer时,都会引发异常。但是我必须将null转换为Integer。 问题答案: 您 不能 从String强制转换为Integer。但是,如果您尝试将字符串转换为整数,并且必须提供处理字符串的实现,请查看以下代码片段:

  • 问题内容: 给定一个数字: 将其转换为字符串的“最佳”方法是: 问题答案: 有多种方法: (我的偏爱) (我不知道编译器如何处理它,也许它和上面一样有效)

  • 问题内容: 我有一个整数 在声明中,我必须将其与一些字符串进行比较。我不能在开始时设置为字符串,因为必须在循环中将其递减。 如何转换? 问题答案: 我找到了答案。 将整数转换为字符串: 将字串转换为整数:

  • 问题内容: 有没有人能将不安全的字符串转换为? 该字符串通常回来为:或类似的东西。 在这种情况下,我要。如果我想。我从不希望该方法失败,但是我不愿意尝试,除非通过它只是为了隐藏错误(以防万一发生极端情况)。 问题答案: 在这种情况下,您确实有一种避免/的方法,尽管我不建议这样做(假设您的输入字符串名为,并且您处于必须返回某些内容的函数中): 将在部分就是你回什么是你想要比如说,如果是,空,全空间,