将 List<Object> 转换为 List<Object.Property> 的最佳方法
Best way to convert a List<Object> to List<Object.Property>
考虑以下用例:
我有 List<Song>
,其中包含 ArrayList
.
我想将上面的内容即时翻译成 List<String>
,它可能是一个 ArrayList
,其中 String
用于存储歌曲的名称(属性:string songName
).
我目前正在使用以下方法:
List<String> songNames = new ArrayList<>();
album.getSongs().forEach(song -> songNames.add(song.getSongName()));
model.setSongs(songNames);
是否有更好的(最好是就地)方式来填充 model.setSongs()
?
PS:我认为将 toString 重载到 return 名称可能有用,但我不知道如何做。
哦对了,我也是Java
的初学者
试试这个:
final var songNames = album.getSongs()
.stream()
.map( Song::getSongName )
.toList();
songNames
在这种情况下是不可变的;如果你坚持要 ArrayList
,它看起来像这样:
final var songNames = new ArrayList<>( album.getSongs()
.stream()
.map( Song::getSongName )
.toList() );
'In-place' 会是这样的:
model.setSongs( album.getSongs()
.stream()
.map( Song::getSongName )
.toList() );
是的,这是当代的 Java。没有使用外部库(当然,除了 Album
和 Song
)。
顺便说一下,覆盖 toString()
来获取歌曲名称并不是一个好主意(至少在大多数情况下不是)。 toString()
提供实例的“字符串表示”——如果它的名称本身确实代表了您上下文中的歌曲,那么您可以覆盖 toString()
。但通常你期望像“Song [Name: name, Duration: 4:33, Interpret: someone, …]”这样的东西作为 toString()
.
的输出
您可以使用将每首歌曲映射到其名称的流:
final var songNames = album.getSongs.stream().map(Song::getName).collect(Collectors.toList());
model.setSongs(songNames);
考虑以下用例:
我有 List<Song>
,其中包含 ArrayList
.
我想将上面的内容即时翻译成 List<String>
,它可能是一个 ArrayList
,其中 String
用于存储歌曲的名称(属性:string songName
).
我目前正在使用以下方法:
List<String> songNames = new ArrayList<>();
album.getSongs().forEach(song -> songNames.add(song.getSongName()));
model.setSongs(songNames);
是否有更好的(最好是就地)方式来填充 model.setSongs()
?
PS:我认为将 toString 重载到 return 名称可能有用,但我不知道如何做。
哦对了,我也是Java
试试这个:
final var songNames = album.getSongs()
.stream()
.map( Song::getSongName )
.toList();
songNames
在这种情况下是不可变的;如果你坚持要 ArrayList
,它看起来像这样:
final var songNames = new ArrayList<>( album.getSongs()
.stream()
.map( Song::getSongName )
.toList() );
'In-place' 会是这样的:
model.setSongs( album.getSongs()
.stream()
.map( Song::getSongName )
.toList() );
是的,这是当代的 Java。没有使用外部库(当然,除了 Album
和 Song
)。
顺便说一下,覆盖 toString()
来获取歌曲名称并不是一个好主意(至少在大多数情况下不是)。 toString()
提供实例的“字符串表示”——如果它的名称本身确实代表了您上下文中的歌曲,那么您可以覆盖 toString()
。但通常你期望像“Song [Name: name, Duration: 4:33, Interpret: someone, …]”这样的东西作为 toString()
.
您可以使用将每首歌曲映射到其名称的流:
final var songNames = album.getSongs.stream().map(Song::getName).collect(Collectors.toList());
model.setSongs(songNames);