我经常这样转换列表
myList.stream().map(el -> el.name).collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)
有没有更短的版本?
没有更短的方法可以使用流来做到这一点。
你可以导入import static java.util.stream.Collectors.*;
然后使用toList
如下来缩短代码,但除此之外。以下内容与使用流一样紧凑:
myList.stream().map(el -> el.name).collect(toList());
Run Code Online (Sandbox Code Playgroud)
您还可以使用方法参考
myList.stream().map(T::getName).collect(toList());
Run Code Online (Sandbox Code Playgroud)
T
包含的类型名称在哪里,name
尽管根据类型名称的长度不能保证更短,但确实提供了更好的可读性,这一点非常重要。
最终,正如所说的那样,它非常紧凑。
您可以静态导入Collectors.*
然后使用该mapping(Function, Collector)
方法,如下所示:
myList.stream().collect(mapping(T::getName, toList()));
Run Code Online (Sandbox Code Playgroud)
其中T::getName
是方法引用,T
是列表中元素的类型。使用它更具可读性,也几乎与写作相同:el -> el.name
您可以创建一个静态辅助方法来完成所有工作:
public static <FROM, TO> List<TO> convert(List<FROM> from, Function<FROM, TO> function) {
return from.stream().map(function).collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
您所要做的就是提供您的列表和任何映射函数:
List<YourClass> yourList = ...;
Function<YourClass, String> func = YourClass::getName;
List<String> converted = convert(yourList, func);
Run Code Online (Sandbox Code Playgroud)
或者更简洁:
List<String> converted = convert(yourList, YourClass::getName);
Run Code Online (Sandbox Code Playgroud)
我认为你应该坚持你已经拥有的。为什么?
\n\n请记住:简洁不是目标。清晰度是。两者经常齐头并进,但并非总是如此,我的感觉是它们可能并不适合您的情况。
\n\n保留:我的风格和品味赞成@Aomine 使用的方法参考,但这是一个品味问题。如果您发现它更清晰,请使用它,而不仅仅是因为它\xe2\x80\x99s 短了几个字符。
\n 归档时间: |
|
查看次数: |
572 次 |
最近记录: |