结合子串的流

Pau*_*ime 9 java substring java-stream

我有以下的代码,遍历对Java DateTimeFormatter的图形组合"E".."EEEE""M".."MMMM".

我的问题是,在这种情况下,是否存在使用Java Streams的惯用方法(或者只是'更惯用')?

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class DateTimeFormattingStackOverflow {
    static LocalDateTime dateTime = LocalDateTime.now();

    static Stream<String> substrings(String str) {
        return IntStream.range(1, str.length() + 1)
                .mapToObj(i -> str.substring(0, i));
    }

    static void printDateTime(String pattern) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern);
        System.out.println(pattern + ", " + dtf.format(dateTime));
    }

    public static void main(String[] args) {
        Stream<String> patterns = substrings("EEEE")
                .flatMap(e -> substrings("MMMM").map(m -> e + " " + m))
                .map(em -> em + " d");

        patterns.forEach(DateTimeFormattingStackOverflow::printDateTime);
    }
}
Run Code Online (Sandbox Code Playgroud)

产量

E M d, Sat 7 1
E MM d, Sat 07 1
E MMM d, Sat Jul 1
E MMMM d, Sat July 1
EE M d, Sat 7 1
EE MM d, Sat 07 1
EE MMM d, Sat Jul 1
EE MMMM d, Sat July 1
...
Run Code Online (Sandbox Code Playgroud)

das*_*ght 0

我会改变生成字符重复运行的方式:我不会手动构造最长的字符串,然后迭代其前缀,而是使用 构造运行Collection.nCopies,如下所示:

static Stream<String> repeatedRuns(String c, int start, int end) {
    return IntStream
        .rangeClosed(start, end)
        .mapToObj(len -> 
            Collections.nCopies(len, c).stream().collect(Collectors.joining(""))
        );
}
Run Code Online (Sandbox Code Playgroud)

然后您将替换substrings("EEEE")repeatedRuns("E", 1, 4).

演示。