将Java 8 Stream映射到元素'方法参考

时间:2016-08-10 13:36:41

标签: java java-8 java-stream

我们说我有这样的界面:

public interface Service {  
    List<Result> getResults();  
    // some other methods  
}

我在List中有List<Service> services个接口的实现。

如何将List转换为对List方法的getResults方法引用(或者甚至更好:List Supplier<List<Result>>} ?

我正在寻找类似于

的东西
List<Supplier<List<Result>>> = services.stream()
    .map(s -> s::getResults)
    .collect(Collectors.toList());

2 个答案:

答案 0 :(得分:6)

编译器似乎需要一些关于类型推断的帮助。

List<Supplier<List<Result>>> list = 
    services.stream()
            .map(s -> (Supplier<List<Result>>)(() -> s.getResults()))
            .collect(Collectors.toList());

以下是一个工作示例,它将Service界面替换为StringBuilder,将Result替换为String。我使用Arrays.asList(s.toString().split(" "))List<String>生成StringBuilder

List<StringBuilder> services = new ArrayList<>();
services.add (new StringBuilder());
services.add (new StringBuilder());
services.get (0).append ("one two three");
services.get (1).append ("four five six");
List<Supplier<List<String>>> list = 
services.stream()
        .map(s -> (Supplier<List<String>>) (() -> Arrays.asList(s.toString().split(" "))))
        .collect(Collectors.toList());
System.out.println (list.get (0).get ());
System.out.println (list.get (1).get ());

输出:

[one, two, three]
[four, five, six]

答案 1 :(得分:2)

方法引用没有特定的类型(它们可以映射到各种功能接口,例如SupplierCallable),所以当类型可以'时,你必须向编译器添加一个提示'推断。 Casting是一种可能性,但我更喜欢显式泛型参数:

List<Supplier<List<Result>>> list = services.stream()
    .<Supplier<List<Result>>>map(s -> s::getResults)
    .collect(Collectors.toList());

一般来说,在lambda表达式中使用方法引用没有任何限制。