在Java 8中,我可以使用map
方法来映射流,例如
Stream.of("Hello", "world").map(s -> s.length())
给我一个包含整数[5, 5]
的流。我正在尝试对列表执行相同操作。我想出了
List<String> list = ...
list.stream().map(s -> s.length()).collect(Collectors.toList())
这有效,但很冗长。有更简洁的解决方案吗?理想情况下,将有一个类似的map
方法用于列表,但是我还没有找到任何方法。那么,还有其他选择吗?
答案 0 :(得分:5)
尽可能紧凑
只需将其包装到您自己的实用程序函数中即可:
public <T, S> List<S> mapBy(List<T> items, Function<T, S> mapFn) {
return items.stream().map(mapFn).collect(Collectors.toList());
}
现在您可以只使用mapBy(students, Student::getName)
。没有比这更详细的了。
请注意,仅当这是您要进行的唯一数据突变时,这才有用。一旦有了更多的流运算符,您就希望应用它,否则这样做会更好,因为否则您将继续创建中间列表,这非常浪费。
答案 1 :(得分:1)
实际上考虑对列表中的每个元素进行操作,您需要对其进行流式处理或循环处理,因此流式处理比循环式更为简洁。有关更多信息,您可以将Lambda表达式替换为方法引用运算符
list.stream().map(String::length).collect(Collectors.toList());