list->stream->map()->list 的快捷方式

wut*_*aer 10 java java-stream

我经常这样转换列表

myList.stream().map(el -> el.name).collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

有没有更短的版本?

Ous*_* D. 6

没有更短的方法可以使用流来做到这一点。

你可以导入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尽管根据类型名称的长度不能保证更短,但确实提供了更好的可读性,这一点非常重要。

最终,正如所说的那样,它非常紧凑。


Lin*_*ica 5

您可以静态导入Collectors.*然后使用该mapping(Function, Collector)方法,如下所示:

myList.stream().collect(mapping(T::getName, toList()));
Run Code Online (Sandbox Code Playgroud)

其中T::getName是方法引用,T是列表中元素的类型。使用它更具可读性,也几乎与写作相同:el -> el.name

  • 很好,我喜欢它,因为它很有想象力,解决了手头的问题+1。尽管应该注意,“映射”收集器_应该_用作_下游_收集器。如果您只想映射元素,那么“map”收集器应该始终优先于“mapping”收集器。 (2认同)

QBr*_*ute 5

您可以创建一个静态辅助方法来完成所有工作:

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)


Ole*_*.V. 5

我认为你应该坚持你已经拥有的。为什么?

\n\n
    \n
  1. 它\xe2\x80\x99s 已经是一行字了。试图进一步压缩它没有任何意义。
  2. \n
  3. 它\xe2\x80\x99s 惯用的。Java 开发人员习惯于读取像您这样的转换,如果您的代码中到处都是 xe2x80x99,那么读取您代码的程序员会更习惯它。即使将其包装在一个方法中,就像 @QBrute 建议的那样,即使是一个好主意,也可能会损害可读性,因为读者不习惯包装方法。
  4. \n
\n\n

请记住:简洁不是目标。清晰度是。两者经常齐头并进,但并非总是如此,我的感觉是它们可能并不适合您的情况。

\n\n

保留:我的风格和品味赞成@Aomine 使用的方法参考,但这是一个品味问题。如果您发现它更清晰,请使用它,而不仅仅是因为它\xe2\x80\x99s 短了几个字符。

\n