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)
我会改变生成字符重复运行的方式:我不会手动构造最长的字符串,然后迭代其前缀,而是使用 构造运行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)
.
归档时间: |
|
查看次数: |
236 次 |
最近记录: |