2017-08-13 67 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