将lambda应用于列表中的每个项目的最惯用机制是什么,返回由结果组成的列表?
例如:
List<Integer> listA = ... imagine some initialization code here ...
List<Integer> listB = listA.apply(a -> a * a); // pseudo-code (there is no "apply")
/* listB now contains the square of every value in listA */
我检查了API javadocs并查看了Apache Commons,但没有找到任何内容。
答案 0 :(得分:27)
您可以Stream
使用map
和collect
:
listB = listA.stream()
.map (a -> a*a)
.collect (Collectors.toList());
答案 1 :(得分:10)
要添加@Eran的答案,我有一个帮助方法:
public static <T, R> List<R> apply(Collection<T> coll, Function<? super T, ? extends R> mapper) {
return coll.stream().map(mapper).collect(Collectors.toList());
}
可以用作:
List<Integer> listB = apply(listA, a -> a * a);
(注意:将需要Java 1.8或更高版本。)
答案 2 :(得分:5)
最标准的方法是最后只有collect them:
List<Integer> listA = ... imagine some initialization code here ...
List<String> listB = listA.stream()
.map(a -> a.toString())
.collect(Collectors.toList());
注意map函数如何引入一个转换,在本例中是Integer转换为String,返回的列表是List<String>
类型。转换由映射执行,List由收集器生成。
答案 3 :(得分:1)
如果您不介意使用第三方库,则可以使用功能强大的新馆藏。
// import javaslang.collection.*;
listB = listA.map(f);
这些Java 8集合是不可变的,可以与Scala和Clojure的集合进行比较。请阅读更多here。
顺便说一句 - for循环还有语法糖:
// import static javaslang.API.*;
// import javaslang.collection.Stream;
Stream<R> result = For(iterable1, ..., iterableN).yield((e1, ..., eN) -> ...);
免责声明:我是Javaslang的创作者。