Java 8 Stream-遍历多个列表并连接答案

时间:2018-06-21 12:51:06

标签: java java-8 java-stream

我的问题如下: 我有一个ListA和一个ENUM。我想遍历ListA,并为ListA中的每个元素应用方法get(value),其中value是一个ENUM。所有这些处理应返回类型T的对象。 我现在拥有的是:

default void processLists(P<?, ?, T> p) {
 T allData = (T) Stream.of(Vvalues.values())
            .map(c -> p.get(c.name()))
            .flatMap(optionalData -> optionalData.map(data -> ((List<T>) data).stream()).orElse(Stream.empty()))
            .collect(Collectors.toList());

    save(allData);
}

...     getListA()。stream()。forEach(p-> processLists(p));

代码(如评论中所述):

getUrls().stream().forEach(url->processUrl(url)); 

default void processUrl(Url<?, ?, T> url) {
    T allData = (T) Stream.of(Location.values()) 
        .map(location -> url.get(location.name())) 
        .flatMap(optionalData -> optionalData
            .map(data -> ((List<T>) data).stream())
            .orElse(Stream.empty()))
        .collect(Collectors.toList()); 
    save(allData); 
 }

这不行,因为我只想调用一次保存。

1 个答案:

答案 0 :(得分:0)

据我所知,您遇到的问题是,您有一个Enum和其他班级,即Data

enum Enum {}

class Data {

    public String get(Enum value) {
        return value.name();
    }

}

您所需要的只是使用Data.get(Enum)中的所有可用常量调用Enum。作为源列表中每个项目的结果,您将获得结果列表,并且希望将所有这些数据作为简单列表来检索。

public static List<String> process(List<Data> data) {
    return data.stream()
               .map(d -> Arrays.stream(Enum.values()).map(d::get).collect(Collectors.toList()))
         //    .map(d -> Arrays.stream(Enum.values()).map(e -> d.get(e.name())).collect(Collectors.toList()))
               .flatMap(List::stream)
               .collect(Collectors.toList());
}

这是客户端代码的示例:

List<String> res = process(new ArrayList<>());