【问题标题】:Convert Stream to String in Java在 Java 中将 Stream 转换为字符串
【发布时间】:2019-11-15 01:26:58
【问题描述】:

我想将 Map 的 Stream 转换为 String,以将其附加到 textArea。我尝试了一些方法,最后一个是使用 StringBuilder,但它们不起作用。

public <K, V extends Comparable<? super V>> String sortByAscendentValue(Map<K, V> map, int maxSize) {

    StringBuilder sBuilder = new StringBuilder();

    Stream<Map.Entry<K,V>> sorted =
            map.entrySet().stream()
               .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()));

    BufferedReader br = new BufferedReader(new InputStreamReader((InputStream) sorted));
    String read;

    try {
        while ((read=br.readLine()) != null) {
            //System.out.println(read);
            sBuilder.append(read);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    sorted.limit(maxSize).forEach(System.out::println);

    return sBuilder.toString();
}

【问题讨论】:

  • 你能给我们一个示例地图,以及字符串输出应该是什么?
  • 我认为您在这里混淆了 Java 的两种(名称混淆)不同类型的“流”。如果您只看Collectors.joining(),您应该能够更简单地实现您的目标,而无需所有BufferedReader 的东西。

标签: java string dictionary stream


【解决方案1】:

您可以将条目收集到单个String 中,如下所示:

  String sorted =
        map.entrySet().stream()
           .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
           .map(e-> e.getKey().toString() + "=" + e.getValue().toString())
           .collect(Collectors.joining (","));

【讨论】:

    【解决方案2】:

    这很容易做到,您可以使用 Steams API 来做到这一点。首先,您将映射中的每个条目映射到单个字符串 - 键和值的连接字符串。完成后,您可以简单地使用reduce() 方法或collect() 方法来完成。

    使用 'reduce()' 方法的代码 sn-p 将如下所示:

        Map<String, String> map = new HashMap<>();
        map.put("sam1", "sam1");
        map.put("sam2", "sam2");
    
        String concatString = map.entrySet()
            .stream()
            .map(element-> element.getKey().toString() + " : " + element.getValue().toString())
            .reduce("", (str1,str2) -> str1 + " , " + str2).substring(3);
    
        System.out.println(concatString);
    

    这将为您提供以下输出:

    sam2 : sam2 , sam1 : sam1
    

    您也可以使用collect()' method instead ofreduce()` 方法。它看起来像这样:

        String concatString = map.entrySet()
                .stream()
                .map(element-> element.getKey().toString() + " : " + element.getValue().toString())
                .collect(Collectors.reducing("", (str1,str2) -> str1 + " , " + str2)).substring(3);
    

    两种方法都提供相同的输出。

    【讨论】:

      【解决方案3】:

      考虑对@Eran 的代码稍作改动,因为HashMap.Entry.toString() 已经为您通过= 加入:

      String sorted =
          map.entrySet().stream()
              .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
              .map(Objects::toString)
              .collect(Collectors.joining(","));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-19
        • 2016-04-06
        • 2023-03-19
        • 2021-09-23
        • 1970-01-01
        • 2012-07-10
        相关资源
        最近更新 更多