按确定对象的总和进行流分组

Stream grouping by sum of determinate objects

我有一个这样的请求 class :

public class Request 
{
String name,destName;
int nSeats;
//Example : requestOne,Paris,3
...
}

我想将请求分组到一个 Map |Integer,List of String| 中其中键是具有相同 destName 的请求的总和,值是目的地的名称。

这是我的代码:

public TreeMap<Integer, List<String>> destinationsPerNSeats() {
return requests.
stream().
collect(Collectors.groupingBy(Request::getnSeats, TreeMap::new, 
Collectors.mapping(Request::getDestName, Collectors.toList()))).
}

输入:

TreeMap<Integer, List<String>> map = mgr.destinationsPerNSeats();
print(map);

输出:{4=[巴黎],3=[伦敦,柏林,柏林],2=[巴黎]}

预期输出:{6=[柏林、巴黎]、3=[伦敦]}

我该如何解决这个问题?谢谢!

我认为您需要两条 Stream 管道。第一个将目的地分组并对每个目的地名称的座位总数求和,第二个将目的地名称按座位数分组:

public TreeMap<Integer, List<String>> destinationsPerNSeats() {
    return
        requests.stream()
                .collect(Collectors.groupingBy(Request::getDestName, 
                                               Collectors.summingInt(Request::getnSeats)))
                .entrySet()
                .stream()
                .collect(Collectors.groupingBy(Map.Entry::getValue,
                                               TreeMap::new,
                                               Collectors.mapping(Map.Entry::getKey,Collectors.toList())));
}

正在使用以下输入测试您的代码:

List<Request> requests = new ArrayList<> ();
requests.add (new Request("John","Paris",4));
requests.add (new Request("Ben","London",3));
requests.add (new Request("Dan","Berlin",3));
requests.add (new Request("Sara","Berlin",3));
requests.add (new Request("Jenn","Paris",2));

产生 Map:

{3=[London], 6=[Berlin, Paris]}