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

时间:2017-08-28 07:24:44

标签: lambda java-8 java-stream

pojos看起来像这样:

String[] stringArray = getResources().getStringArray(R.array.my_string_array);

想获得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<List<String>>

这是有效的,但看起来并不好

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

2 个答案:

答案 0 :(得分:2)

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

    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。

答案 1 :(得分:1)

我无法说明为什么你发现不好,我只能想到这种方式,但它几乎没有任何好处,可能会更具可读性:

obj.getEntities().stream()
                 .flatMap(e -> Stream.of(e.getFields().stream()
                      .map(f -> f.getValues().get(0).getValue())))
                 .collect(Collectors.mapping(
                       x -> x.collect(Collectors.toList()),
                       Collectors.toList()));