Java 8惯用的方法将Lambda应用于List返回另一个List?

时间:2014-10-05 17:43:13

标签: java list lambda java-8 list-comprehension

将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,但没有找到任何内容。

4 个答案:

答案 0 :(得分:27)

您可以Stream使用mapcollect

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的创作者。