2017-09-15 2 views
0

Ich habe diese Klasse:Java 8 Collector mit Verketten

class Pair { 
    public String name; 
    public int age; 
} 

Und eine Liste:

List<Pair> list = new LinkedList<>(); 
list.add(new Pair("One", 25)); 
list.add(new Pair("Two", 18)); 
list.add(new Pair("Three", 18)); 
list.add(new Pair("Four", 10)); 

Wo Pair nur zwei Werte enthält, eine String und eine int.

Ich möchte diese Daten durch seine age Wert gruppieren, sondern auch verketten die name. Im Finale will ich eine Map<Integer, String> wie diese erhalten:

25 - One 
18 - TwoThree 
10 - Four 

ich das versucht:

list.stream().collect(Collectors.groupingBy(Pair::getValue, /* Collectors.??? */)); 

Es Methoden sind wie summingInt, kann aber nichts für String Werte finden.

Ich sehe, es gibt eine Collectors.reducing Methode, ich denke, wir können es vielleicht verwenden, nicht sicher, wie man es tut.

Gibt es eine elegante Möglichkeit, es mit Build Collectors zu tun, oder muss ich mein eigenes machen?

+3

Klingt, als ob Sie nach 'Collectors.joining' suchen. –

+0

Wie definiere ich in '' Collectors.joining'', dass ich '' name'' Wert verketten möchte? Soweit ich weiß, können Sie es für eine Liste von '' String'' anwenden, aber ich habe hier eine Liste von '' Paar'' –

+2

'Collectors.mapping (Pair :: getName, Collectors.joining())'. –

Antwort

3

Verwenden Sie einfach Collectors.mapping(Pair::getName, Collectors.joining()). joining behandelt die Strings und mapping extrahiert sie aus den Paarobjekten.