将Java 8 Stream映射到元素的方法引用

mkv*_*cvc 4 java java-8 java-stream

假设我有这样的界面:

public interface Service {  
    List<Result> getResults();  
    // some other methods  
}
Run Code Online (Sandbox Code Playgroud)

我有一个List该接口的实现List<Service> services.

如何变换List成一个List方法引用到getResults方法(甚至更好:一ListSupplier<List<Result>>)动态?

我正在寻找类似的东西

List<Supplier<List<Result>>> = services.stream()
    .map(s -> s::getResults)
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 6

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

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

这里有一个工作示例它取代您Service与接口StringBuilder和你ResultString.我使用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 ());
Run Code Online (Sandbox Code Playgroud)

输出:

[one, two, three]
[four, five, six]
Run Code Online (Sandbox Code Playgroud)

  • 这也可以在`map`阶段之前完成,例如:`services.stream().<Supplier <List <String >>> map(...)` (2认同)
  • "你不能在lambda表达式中包含方法引用" - 错误的语句. (2认同)