【问题标题】:java stream 8, every sixth word print in new linejava stream 8,每第六个单词在新行中打印
【发布时间】:2021-12-28 20:31:57
【问题描述】:
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)。 每六个单词打印一个新行。

【问题讨论】:

  • 使用常规 for 循环(一般为list.forEachfor-each)隐藏迭代器;所以你不知道你什么时候在第六个字。
  • 这能回答你的问题吗? Take every nth element from a Java 8 stream
  • 不要将collect(Collectors.toList()) 的结果转换为ArrayList。文档没有指定您可以期待什么列表,也没有理由不使用 List&lt;String&gt; list = …。顺便说一句,你可以写! x.isEmpty()而不是x.length() != 0

标签: java lambda foreach collections java-stream


【解决方案1】:

将列表分成 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("; "))
    ));

【讨论】:

    【解决方案2】:

    你可以使用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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2022-11-26
      相关资源
      最近更新 更多