2017-08-13 49 views
2

我想从使用流和集合的对象列表中获取键和值列表,但我不知道它是否可能。使用流收集器从java对象获取键值

我有这个类:

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; } 
} 

我想处理这个对象的列表,并获得所有的值并以逗号分隔的所有密钥。

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

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

+2

我没有看到任何值MyObject'类 – Andrew

+0

您的意思是列表 objectList? – Elsa

+0

值存储在哪里?他们是在课堂上定义的吗? – Andrew

回答

7

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

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

*由于某些字段(键)不是String类型, Stream<Object>可以通过Stream#map(Object::toString)变成Stream<String>

**如果您有吸气剂,也可以使用这些值。


进一步移动,我会定义提取(Function<MyObject, String>)的List为类(有可能返回此列表中的静态方法):

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))) 
+2

或者您可以将key 1转换为String并直接获取'Stream ':flatMap(o - > Stream.of(String.valueOf(o.getKey1()),o.getKey2(),o.getKey3() ))' – Andreas