【问题标题】:How to convert a list of Songs into stream of Strings?如何将歌曲列表转换为字符串流?
【发布时间】:2017-11-21 19:37:29
【问题描述】:

我有一个歌曲列表,这是一个具有 3 个值的类:songNamealbumNamedurationhash。 我编写了一个函数,它返回按名称排序的所有歌曲的Stream<String>。 我的第一个想法是:

public Stream<String> orderedSongNames() {
     return songs.stream().sorted((s1,s2)>s1.getSongName().compareTo(s2.getSongName()));
}

问题是这样,返回值是Stream&lt;Song&gt;,但我想要Stream&lt;String&gt;。有人知道我如何解决手头的问题吗?

【问题讨论】:

  • 您在(s1,s2)-&gt;(而不是(s1,s2)&gt;)这里缺少一个破折号。你可以考虑.sorted(Comparator.comparing(Song::getSongName))
  • 如果你想要一个“字符串流”,为什么你会遇到“返回值是一个流”的问题?如果您想要返回 Songs 或 Strings,也不清楚。你得到了一堆答案,每个回答者都按照他的意愿理解你的问题,请澄清一下。

标签: java list java-stream


【解决方案1】:

考虑到您已经覆盖了toString 方法;您可以像这样返回每个对象字符串表示的流:

return songs.stream()
            .sorted((s1, s2) -> s1.getSongName().compareTo(s2.getSongName()))
            .map(Object::toString); 

或者,如果您想返回一个 Stream&lt;String&gt;,其中的字符串是歌曲名称。

return songs.stream()
            .sorted((s1, s2) -> s1.getSongName().compareTo(s2.getSongName()))
            .map(Song::getSongName); 

【讨论】:

    【解决方案2】:

    如果您想获得按长度排序的歌曲名称Stream&lt;String&gt;, 然后首先通过获取它们的名称将Song 实例映射String

    public Stream<String> orderedSongNames() {
        return songs.stream()
            .map(Song::getSongName)
            .sorted(String::compareTo);
    }
    

    您可以按照其他答案的建议先排序,然后再映射, 结果和过程几乎相同, 但写起来有点冗长, 这就是我重新排序这些操作的原因:

    public Stream<String> orderedSongNames() {
        return songs.stream()
            .sorted(Comparator.comparing(Song::getSongName))
            .map(Song::getSongName);
    }
    

    【讨论】:

      【解决方案3】:

      你只需要映射它:

      public Stream<String> orderedSongNames() {
        return songs.stream()    
          .sorted((s1,s2)>s1.getSongName().compareTo(s2.getSongName()))
          .map((s) -> s.getSongName());
      }
      

      【讨论】:

        【解决方案4】:

        &gt; 之前缺少破折号:

        return songs.stream().sorted((s1,s2)->s1.getSongName().compareTo(s2.getSongName()));
                                            ^--- here
        

        但是,只需这样做:

        return songs.stream().sorted(Comparator.comparing(Song::getSongName));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-29
          • 1970-01-01
          • 2019-12-11
          • 1970-01-01
          • 1970-01-01
          • 2018-07-22
          相关资源
          最近更新 更多