在做groupingBy之后,我想从每个组中获得Top2,我如何在Java 8中获得这个


Map<Object, List<MasterView>> result = 
navList.stream().collect(Collectors.groupingBy(navData-> 
new ArrayList<String>(Arrays.asList(navData.getCode(),navData.getCurrency()))));

从这个我得到组。

之后如何进行?

您可以将colltingandthen作为第二个参数添加到您的groupingBy,它将对最终列表执行额外的整理转换。

Collector<MasterView, Object, List<MasterView>> top2 = Collectors.collectingAndThen(Collectors.toList(), it -> it.stream().limit(2).collect(Collectors.toList()));

Map<Object, List<MasterView>> result =
navList.stream().collect(Collectors.groupingBy(navData->
new ArrayList<String>(Arrays.asList(navData.getCode(),navData.getCurrency())), top2));

看看这是否对你有帮助。

List navList = new ArrayList<>();

navList.add(new MasterView(195, 21));
navList.add(new MasterView(115, 30));
navList.add(new MasterView(115, 34));
navList.add(new MasterView(145, 58));
navList.add(new MasterView(145, 28));
navList.add(new MasterView(155, 26));
navList.add(new MasterView(155, 27));
navList.add(new MasterView(177, 22));
navList.add(new MasterView(177, 20));
navList.add(new MasterView(177, 10));
navList.add(new MasterView(177, 12));
Map<Integer, List<MasterView>> result =
navList.stream().collect(Collectors.groupingBy(MasterView::getCode));
Map<Integer, List<MasterView>> top2Map = new HashMap<>();
for (Map.Entry<Integer, List<MasterView>> entry : result.entrySet()) {
List<MasterView> masterViews = entry.getValue();
if (masterViews.size() > 2)
masterViews.sort(Collections.reverseOrder());
else if (masterViews.size() == 1)
top2Map.put(entry.getKey(), Arrays.asList(entry.getValue().get(0)));
else
top2Map.put(entry.getKey(), Arrays.asList(entry.getValue().get(0), entry.getValue().get(1)));
}

如果你想对一个自定义对象使用Collections.sort()方法,你需要准备它:

class MasterView implements Comparable<MasterView> {
private Integer code;
private Integer currency;
public MasterView(int code, int currency) {
this.code = code;
this.currency = currency;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public Integer getCurrency() {
return currency;
}
public void setCurrency(Integer currency) {
this.currency = currency;
}

@Override
public int compareTo(MasterView o) {
return this.getCurrency().compareTo(o.getCurrency());
}
}

最新更新