java 流 8,每六个字换行打印
java stream 8, every sixth word print in new line
public class Histogram {
public static void main(String[] args) throws IOException {
Stream<String> stream = Files.lines(Paths.get("words.txt"));
ArrayList<String> list = (ArrayList<String>) stream
.map(w -> w.split("\.|\s+|,")).flatMap(Arrays::stream)
.filter(x-> x.length() != 0)
.collect(Collectors.toList());
list.forEach(s -> System.out.print(s + "(" + s.length() + ") "));
}
}
现在我在一行中得到了所有结果。
我如何在此 Java 流 8 中制定逻辑,将 forEach 循环中的每 5 个单词放入换行符 (System.out.println
)。
每六个字换行打印。
将列表分成 5 个块,并加入每个块中的项目。
IntStream.iterate(0, i -> i < list.size(), i -> i + 5)
.forEach(i -> System.out.println(
IntStream.range(i, Math.min(i + 5, list.size()))
.mapToObj(list::get)
.map(s -> s + "(" + s.length() + ")")
.collect(Collectors.joining("; "))
));
注意:Stream.iterate
with condition 在 Java 9 中可用。
纯 Java 8 解决方案可以使用 Stream.limit
和计算出的块数:
IntStream.iterate(0, i -> i + 5)
.limit(list.size() / 5 + (list.size() % 5 > 0 ? 1 : 0))
.forEach(i -> System.out.println(
IntStream.range(i, Math.min(i + 5, list.size()))
.mapToObj(list::get)
.map(s -> s + "(" + s.length() + ")")
.collect(Collectors.joining("; "))
));
您可以使用 stream
:
private static final String NEW_LINE = System.lineSeparator();
public static String addNewLines(String str, int n) {
String[] words = str.split(" ");
int size = words.length;
int lines = (int) Math.round((double) size / n);
int lastLine = size - lines * n;
return IntStream.range(0, lines)
.mapToObj(i -> toString(words, i * n, i * n + n))
.collect(Collectors.joining(NEW_LINE, "", lastLine > 0
? NEW_LINE + toString(words, size - lastLine, size)
: ""));
}
private static String toString(String[] words, int start, int end) {
return Arrays.stream(words, start, end).collect(Collectors.joining(" "));
}
然后:
String str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam egestas maximus augue, in vehicula erat dictum quis. Sed rhoncus tempor maximus. Etiam tempus tristique ex et imperdiet.";
System.out.println(addNewLines(str, 5));
输出:
Lorem ipsum dolor sit amet,
consectetur adipiscing elit. Nam egestas
maximus augue, in vehicula erat
dictum quis. Sed rhoncus tempor
maximus. Etiam tempus tristique ex
et imperdiet.
public class Histogram {
public static void main(String[] args) throws IOException {
Stream<String> stream = Files.lines(Paths.get("words.txt"));
ArrayList<String> list = (ArrayList<String>) stream
.map(w -> w.split("\.|\s+|,")).flatMap(Arrays::stream)
.filter(x-> x.length() != 0)
.collect(Collectors.toList());
list.forEach(s -> System.out.print(s + "(" + s.length() + ") "));
}
}
现在我在一行中得到了所有结果。
我如何在此 Java 流 8 中制定逻辑,将 forEach 循环中的每 5 个单词放入换行符 (System.out.println
)。
每六个字换行打印。
将列表分成 5 个块,并加入每个块中的项目。
IntStream.iterate(0, i -> i < list.size(), i -> i + 5)
.forEach(i -> System.out.println(
IntStream.range(i, Math.min(i + 5, list.size()))
.mapToObj(list::get)
.map(s -> s + "(" + s.length() + ")")
.collect(Collectors.joining("; "))
));
注意:Stream.iterate
with condition 在 Java 9 中可用。
纯 Java 8 解决方案可以使用 Stream.limit
和计算出的块数:
IntStream.iterate(0, i -> i + 5)
.limit(list.size() / 5 + (list.size() % 5 > 0 ? 1 : 0))
.forEach(i -> System.out.println(
IntStream.range(i, Math.min(i + 5, list.size()))
.mapToObj(list::get)
.map(s -> s + "(" + s.length() + ")")
.collect(Collectors.joining("; "))
));
您可以使用 stream
:
private static final String NEW_LINE = System.lineSeparator();
public static String addNewLines(String str, int n) {
String[] words = str.split(" ");
int size = words.length;
int lines = (int) Math.round((double) size / n);
int lastLine = size - lines * n;
return IntStream.range(0, lines)
.mapToObj(i -> toString(words, i * n, i * n + n))
.collect(Collectors.joining(NEW_LINE, "", lastLine > 0
? NEW_LINE + toString(words, size - lastLine, size)
: ""));
}
private static String toString(String[] words, int start, int end) {
return Arrays.stream(words, start, end).collect(Collectors.joining(" "));
}
然后:
String str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam egestas maximus augue, in vehicula erat dictum quis. Sed rhoncus tempor maximus. Etiam tempus tristique ex et imperdiet.";
System.out.println(addNewLines(str, 5));
输出:
Lorem ipsum dolor sit amet,
consectetur adipiscing elit. Nam egestas
maximus augue, in vehicula erat
dictum quis. Sed rhoncus tempor
maximus. Etiam tempus tristique ex
et imperdiet.