在 Java 中将 Stream 转换为字符串

Posted

技术标签:

【中文标题】在 Java 中将 Stream 转换为字符串【英文标题】:Convert Stream to String in Java 【发布时间】: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 的东西。 【参考方案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(","));

【讨论】:

以上是关于在 Java 中将 Stream 转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

在Java 8中将整数数组转换为字符串数组的最简单方法[重复]

在Java中将字符串转换为“字符”数组

在java中将字符串转换为字节[重复]

如何在java中将当前日期转换为字符串?

如何在 java 中将“'\n'”(字符串)转换为 '\n'(字符)

如何在Java中将字符从字母字符转换为十六进制数字?