如何在Java 8+中将范围转换为分隔的字符串

gil*_*des 8 java-8 java-stream

如何将Java中的范围(使用java.util.stream.LongStreamjava.util.stream.IntStream)转换为Java 中的分隔字符串?

我试过了:

String str = LongStream.range(16, 30)
                .boxed()
                .map(String::valueOf)
                .collect(Collectors.joining(","));
System.out.println(str);
Run Code Online (Sandbox Code Playgroud)

这打印:

16,17,18,19,20,21,22,23,24,25,26,27,28,29
Run Code Online (Sandbox Code Playgroud)

同样可以使用IntStream.是否有更方便的范围转换为分隔字符串?

Eug*_*ene 8

说真的,只是为了它的乐趣.使用番石榴:

String result = ContiguousSet.create(
                       Range.closedOpen(16, 31), DiscreteDomain.integers())
                             .asList()
                             .toString();
Run Code Online (Sandbox Code Playgroud)

要么

 String result = String.join(",",
            IntStream.rangeClosed(16, 30).mapToObj(String::valueOf).toArray(String[]::new));
Run Code Online (Sandbox Code Playgroud)

要么:

String result = String.join(",",
            () -> IntStream.rangeClosed(16, 31).mapToObj(x -> (CharSequence) String.valueOf(x)).iterator());
Run Code Online (Sandbox Code Playgroud)

或者(似乎我被这一点带走了):

String result = IntStream.rangeClosed(16, 31)
            .boxed()
            .collect(
                    Collector.of(
                            () -> new Object() {
                                StringBuilder sb = new StringBuilder();
                            },
                            (obj, i) -> obj.sb.append(i).append(",")
                            ,
                            (left, right) -> {
                                left.sb.append(right.sb.toString());
                                return left;
                            },
                            x -> {
                                x.sb.setLength(x.sb.length() - 1);
                                return x.sb.toString();
                            })
            );
Run Code Online (Sandbox Code Playgroud)

在Holger的优点之后,这里甚至是一个更简单的版本:

    StringBuilder sb = IntStream.range(16, 30)
            .collect(
                    StringBuilder::new,
                    (builder, i) -> builder.append(i).append(", "),
                    StringBuilder::append);

    if (sb.length() != 0) {
        sb.setLength(sb.length() - 2);
    }
    String result = sb.toString(); 
Run Code Online (Sandbox Code Playgroud)

  • 如果要使用手动收集器,请使用three-arg`collect`方法而不是`Collector.of`.这样,你的方法有一点,因为它允许省略`boxed()`,使其更有效.然后,不要将`StringBuilder`包装到另一个对象中; 这是不必要的:`StringBuilder sb = IntStream.range(16,30).collect(StringBuilder :: new,(b,i) - > b.append(i).append(","),StringBuilder :: append); if(sb.length()!= 0)sb.setLength(sb.length() - 2); String result = sb.toString();` (2认同)

Ole*_*hov 6

IntStream.mapToObj:

String s = IntStream.range(16, 30)
                    .mapToObj(String::valueOf)
                    .collect(Collectors.joining(","));
Run Code Online (Sandbox Code Playgroud)