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

时间:2019-09-29 11:19:28

标签: java java-stream

我经常那样转换列表

editCell(id){
    console.log("index" , id)
    this.editable =true
  }

有没有更短的版本?

4 个答案:

答案 0 :(得分:4)

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

  1. 已经是一线了。试图将其进一步压缩毫无意义。
  2. 这很惯用。 Java开发人员习惯于读取像您这样的转换,如果转换在您的代码中无处不在,那么读取您的代码的程序员将更加习惯。即使将其包装为@QBrute建议的方法,即使是一个好主意,也可能会损害可读性,因为读者不习惯使用包装方法。

请记住:简洁不是目标。清晰度是。两者经常并驾齐驱,但并非总是如此,我的感觉是他们可能不在您的情况下。

预订:我的风格和品味都赞成@Aomine使用的方法参考,但这是一个品味问题。如果您觉得它更清晰,请使用它,而不仅仅是因为它短了几个字符。

答案 1 :(得分:3)

没有使用流进行此操作的更短方法。

您可以导入import static java.util.stream.Collectors.*;,然后按如下所示使用toList来缩短代码,但要缩短一点。下面是使用流时的紧凑形式:

myList.stream().map(el -> el.name).collect(toList());

您还可以使用方法参考

myList.stream().map(T::getName).collect(toList()); 

其中T是包含name的类型的名称,尽管根据类型名称的长短不能保证将其缩短,但是确实提供了更好的可读性非常重要。

最终,正如所说的那样,它变得尽可能紧凑。

答案 2 :(得分:3)

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

myList.stream().collect(mapping(T::getName, toList()));

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

答案 3 :(得分:3)

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

public static <FROM, TO> List<TO> convert(List<FROM> from, Function<FROM, TO> function) {
    return from.stream().map(function).collect(Collectors.toList());
}

您要做的就是提供列表和任何映射功能:

List<YourClass> yourList = ...;
Function<YourClass, String> func = YourClass::getName;
List<String> converted = convert(yourList, func);

或更简洁:

List<String> converted = convert(yourList, YourClass::getName);