我创建了一个简单的基于循环的解决方案,将破折号(-)加在每三位数上。
private String appendedDashOnEachThirdDigit(String digitString) {
char digits[] = digitString.toCharArray();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < digits.length; i++) {
char ch = digits[i];
builder.append(ch);
if ((i + 1) % 3 == 0 && i - 1 != digits.length) {
builder.append('-');
}
}
return builder.toString();
}
现在,我想创建基于Java 8流的等效解决方案。这是非常基本的情况,我想知道如何使用流api做到这一点?
我已经创建了这个基本的流功能:-
private String appendedDashOnEachThirdDigitByStream(String digitString) {
//char[] chars = digitString.toCharArray();
//return IntStream.range(0, chars.length)
// .filter(i -> (i + 1) % 3 == 0 && i - 1 != chars.length)
// .collect(Collectors.collectingAndThen(Collectors.toList(),
// new Function<List<Object>, Object>() {
// }))
return digitString.chars()
.mapToObj(value -> String.valueOf((char) value))
.collect(Collectors.joining("-"));
}
答案 0 :(得分:0)
虽然有可能不是最佳解决方案。
class T {
final int i;
final int c;
public T(int i, int c) {
this.i = i;
this.c = c;
}
}
int[] i = {0};
String res = "123456789".chars()
.mapToObj(c -> new T(i[0]++, c))
.collect(Collectors.groupingBy(x -> x.i / 3))
.entrySet()
.stream()
.sorted(Comparator.comparing(Map.Entry::getKey))
.map(x ->
x.getValue().stream().mapToInt(y -> y.c)
.mapToObj(y -> String.valueOf((char)y))
.collect(Collectors.joining())
).collect(Collectors.joining("-"));
System.out.println("res = " + res);
这里的主要问题是,当您的元素独立时,流是好的。在您的方案中,处理取决于位置,因此需要有线分组。