将 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。没有使用外部库(当然,除了 AlbumSong)。

顺便说一下,覆盖 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);