2017-08-13 4 views
2

Ich versuche, Schlüssel und Werteliste aus einer Liste von Objekten mit Stream und Collectorts zu bekommen, aber ich weiß nicht, ob es möglich ist.Get Schlüssel-Werte von Java-Objekt mit Stream-Collectors

Ich habe diese Klasse:

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

Ich möchte eine Liste dieses Objekt verarbeiten und alle Werte und alle Schlüssel durch Komma getrennt zu erhalten.

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

Weiß jemand, wenn es möglich ist? oder sollte ich eine andere Option ausprobieren?

+2

Ich sehe keine Werte in die 'MyObject' Klasse – Andrew

+0

Meinst du für Liste objectList? – Elsa

+0

wo sind Werte gespeichert? Sind sie innerhalb der Klasse definiert? – Andrew

Antwort

7

Für jedes Element einer Stream<MyObject>, Sie ** von der Stream#flatMap und Stream.of eine Stream<String> * seiner Schlüssel erstellen:

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

* Da einige der Felder (Schlüssel) sind nicht die String Typ, Eine Stream<Object> kann durch die Stream#map(Object::toString) in eine Stream<String> umgewandelt werden.

** Das gleiche ist mit Werten möglich, wenn Sie Getter für sie haben.


Bewegen wir uns weiter, würde ich eine List von Extraktoren (Function<MyObject, String>) für die Klasse definieren (es kann eine statische Methode sein, um diese Liste zurückzukehren):

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

Oder Sie können Schlüssel 1 in String konvertieren und erhalten einen 'Stream ' direkt: 'flatMap (o -> Stream.von (String.valueOf (o.getKey1()), o.getKey2(), o.getKey3())) ' – Andreas

Verwandte Themen