簡體   English   中英

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

[英]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]

方法引用沒有特定類型(它們可以映射到各種功能接口,例如SupplierCallable ),因此當無法推斷類型時,必須向編譯器添加提示。 轉換是一種可能性,但我更喜歡顯式泛型參數:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM