[英]Mapping Java 8 Stream to elements' method reference
假設我有這樣的界面:
public interface Service {
List<Result> getResults();
// some other methods
}
我有一個List
中該接口的實現的List<Service> services
。
如何動態地將該List
轉換為getResults
方法的方法引用List
(甚至更好: List
of Supplier<List<Result>>
)?
我正在尋找類似的東西
List<Supplier<List<Result>>> = services.stream()
.map(s -> s::getResults)
.collect(Collectors.toList());
似乎編譯器需要一些類型推斷的幫助。
List<Supplier<List<Result>>> list =
services.stream()
.map(s -> (Supplier<List<Result>>)(() -> s.getResults()))
.collect(Collectors.toList());
這是一個工作示例,它使用StringBuilder
替換您的Service
接口,並使用String
替換您的Result
。 我正在使用Arrays.asList(s.toString().split(" "))
從每個StringBuilder
生成List<String>
。
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]
方法引用沒有特定類型(它們可以映射到各種功能接口,例如Supplier
或Callable
),因此當無法推斷類型時,必須向編譯器添加提示。 轉換是一種可能性,但我更喜歡顯式泛型參數:
List<Supplier<List<Result>>> list = services.stream()
.<Supplier<List<Result>>>map(s -> s::getResults)
.collect(Collectors.toList());
通常,在lambda表達式中使用方法引用沒有任何限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.