我们说我有这样的界面:
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());
答案 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)
方法引用没有特定的类型(它们可以映射到各种功能接口,例如Supplier
或Callable
),所以当类型可以'时,你必须向编译器添加一个提示'推断。 Casting是一种可能性,但我更喜欢显式泛型参数:
List<Supplier<List<Result>>> list = services.stream()
.<Supplier<List<Result>>>map(s -> s::getResults)
.collect(Collectors.toList());
一般来说,在lambda表达式中使用方法引用没有任何限制。