lambda - 使用 flatMap 将三重列表转换为双重列表

标签 lambda java-8 java-stream

pojo 看起来像这样:

public class Obj {
    List<Entities> entities;    
}

public class Entities { 
    List<Fields> fields;    
}

public class Fields {
    List<Value> values; //Get only first member : values.get(0)!!!!
}


public class Value {    
    public String getValue() {
        return value;
    }       
}

想得到List<List<String>> -(包含值的实体列表)

这让我很累,但它只返回列表

 obj.getEntities().stream()                     
            .map(m -> m.getFields())
            .flatMap(o -> o.stream())
            .map( k -> k.getValues().get(0).getValue())
            .collect(Collectors.toList());

这是可行的,但看起来不太好

List<List<String>> s1 = obj.getEntities().stream()                      
            .map(m -> m.getFields().stream()
                    .map(o -> o.getValues().get(0).getValue())
                    .collect(Collectors.toList())                                           )                         
            .collect(Collectors.toList());

最佳答案

您可以通过将函数提取到变量中来使其更具可读性:

    Function<Entities, List<String>> extractFirstFieldsValues =  m -> m.getFields().stream()
            .map(o -> o.getValues().get(0).getValue())
            .collect(Collectors.toList());

    List<List<String>> s1 = obj.getEntities().stream()
            .map(extractFirstFieldsValues)
            .collect(Collectors.toList());

如果需要,您可以使用 o -> o.getValues().get(0).getValue() 执行相同的操作,而不是使用一个复杂的 lambda,而是使用三个简单的 lambda。

关于lambda - 使用 flatMap 将三重列表转换为双重列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45913752/

相关文章:

java 8 streams 如何将 Map<String, List<Strings>> 转换为 List<String> 将所有字符串值?

lambda - OrElse在 Java8 中获取链接

java - 将 java lambda 转换为 pre java 1.8 函数

java - 将 Double 转换为OptionalDouble 的方法

Java 8 本地日期时间与日期

Java 8 Map KeySet Stream 无法按预期在 Collector 中使用

java - 使用 Java 8 流查找 List<Object> 中值的总计

java - Lambda 表达式对象映射问题

c# - Linq:获取丢失的记录

java - 编译器如何翻译 Java 中的 lambda 表达式?