使用流收集器从java对象获取键值

Els*_*lsa 2 java java-8 java-stream collectors

我正在尝试使用流和集合从对象列表中获取键和值列表,但我不知道是否可能.

我有这门课:

public class MyObject {

    private int key1;

    private String key2;

    private String key3;

    public int getKey1() { return key1; }

    public void setKey1(int key1) { this.key1 = key1; }

    public String getKey2() { return key2; }

    public void setKey2(String key2) { this.key2 = key2; }

    public String getKey3() { return key3; }

    public void setKey3(String key3) { this.key3 = key3; }
}
Run Code Online (Sandbox Code Playgroud)

我想处理这个对象的列表,并用逗号分隔所有值和所有键.

List<MyObject> objectList = myObjectList;
String keys = objectList.stream().collect(Collectors.joining(", ","(", ")"));
String values = Collections.nCopies(objectList.size(), "?").stream().collect(Collectors.joining(", ", " (", ")"));
Run Code Online (Sandbox Code Playgroud)

有谁知道这是否可能?或者我应该尝试其他选择?

And*_*lko 7

对于a的每个元素Stream<MyObject>,您可以Stream<String>通过Stream#flatMap和创建其键*的*Stream.of:

String keys = objectList
        .stream()
        .flatMap(o -> Stream.of(o.getKey1(), o.getKey2(), o.getKey3()).map(Object::toString))
        .collect(Collectors.joining(",", "(", ")"));
Run Code Online (Sandbox Code Playgroud)

*由于一些字段(键)的不属于String类型,Stream<Object>可以变成一个Stream<String>Stream#map(Object::toString).

**如果您有吸气剂值,则可以使用相同值.


进一步说,我将为类定义一个Listextractors(Function<MyObject, String>)(可以有一个静态方法来返回此列表):

public static List<Function<MyObject, String>> getExtractors() {
    return Arrays.asList(
            o -> String.valueOf(o.getKey1()),
            MyObject::getKey2,
            MyObject::getKey3
    );
}

.flatMap(o -> getExtractors().stream().map(extractor -> extractor.apply(o)))
Run Code Online (Sandbox Code Playgroud)

  • 或者你可以将key 1转换为String并直接获得`Stream <String>`:`flatMap(o - > Stream.of(String.valueOf(o.getKey1()),o.getKey2(),o.getKey3( )))` (2认同)