我有一个歌曲列表,这是一个包含3个值的类:songName
,albumName
,duration
和hash
。
我编写了一个函数,它返回按名称排序的所有歌曲的Stream<String>
。
我的第一个想法是:
public Stream<String> orderedSongNames() {
return songs.stream().sorted((s1,s2)>s1.getSongName().compareTo(s2.getSongName()));
}
问题在于,通过这种方式,返回值为Stream<Song>
,但我想要Stream<String>
。有没有人知道如何解决手头的问题?
答案 0 :(得分:0)
考虑到您已覆盖toString
方法;你可以返回每个对象的字符串表示形式,如下所示:
return songs.stream()
.sorted((s1, s2) -> s1.getSongName().compareTo(s2.getSongName()))
.map(Object::toString);
或者,如果您想要返回Stream<String>
,其中字符串是歌曲名称。
return songs.stream()
.sorted((s1, s2) -> s1.getSongName().compareTo(s2.getSongName()))
.map(Song::getSongName);
答案 1 :(得分:0)
如果您希望按长度排序Stream<String>
个歌曲名称,
然后通过获取他们的名字,首先将<{1}}个实例 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);
}
答案 2 :(得分:0)
你只需要映射它:
matrix @ list
答案 3 :(得分:0)
您错过了>
之前的短划线:
return songs.stream().sorted((s1,s2)->s1.getSongName().compareTo(s2.getSongName()));
^--- here
但是,只需这样做:
return songs.stream().sorted(Comparator.comparing(Song::getSongName));