【发布时间】:2016-12-08 01:17:17
【问题描述】:
我需要你的帮助,
在 Java 8 中使用 Collectors groupingBy 我需要对这样的列表进行分组
ValueObject {id=1, value=2.0}
ValueObject {id=2, value=2.0}
ValueObject {id=3, value=2.0}
ValueObject {id=4, value=3.0}
ValueObject {id=5, value=3.0}
ValueObject {id=6, value=4.0}
ValueObject {id=7, value=4.0}
ValueObject {id=8, value=4.0}
ValueObject {id=9, value=4.0}
ValueObject {id=10, value=4.0}
在另一个这样的
GroupedObject {from=1, to=3, value=2.0}
GroupedObject {from=4, to=5, value=3.0}
GroupedObject {from=6, to=10, value=4.0}
这些是我正在使用的对象的定义
public class ValueObject {
private int id;
private double value;
public String getId() {
return id;
}
public float getValue() {
return value;
}
public void setValue(float value) {
this.value = value;
}
}
public class GroupedObject {
private int from;
private int to;
private double value;
public int getFrom() {
return from;
}
public void setFrom(int from) {
this.from = from;
}
public int getTo() {
return to;
}
public void setTo(int to) {
this.to = to;
}
public double getValue() {
return value;
}
public void setValue(double value) {
this.value = value;
}
}
这就是我以编程方式进行操作的方式。
public class Service {
public List<GroupedObject> groupToRange(List<ValueObject> list) {
List<GroupedObject> filtered = new ArrayList<>();
if (list.size() > 0) {
ValueObject current = list.get(0);
GroupedObject dto = new GroupedObject();
dto.setValue(current.getValue());
dto.setFrom(current.getId());
for (int i = 0; i < list.size(); i++) {
ValueObject vo = list.get(i);
if (vo.getValue() != current.getValue()) {
dto.setTo(current.getId());
filtered.add(dto);
dto = new GroupedObject();
dto.setValue(vo.getValue());
dto.setFrom(vo.getId());
current = vo;
} else {
current = vo;
}
if (i == list.size() - 1) {
dto.setTo(vo.getId());
filtered.add(dto);
}
}
}
return filtered;
}
}
这是单元测试
public class ServiceTest {
Service service = new Service();
@Test
public void testgGoupToRange() {
List entryList = new ArrayList<>();
entryList.add(new ValueObject(1, 2.0));
entryList.add(new ValueObject(2, 2.0));
entryList.add(new ValueObject(3, 2.0));
entryList.add(new ValueObject(4, 3.0));
entryList.add(new ValueObject(5, 3.0));
entryList.add(new ValueObject(6, 4.0));
entryList.add(new ValueObject(7, 4.0));
entryList.add(new ValueObject(8, 4.0));
entryList.add(new ValueObject(9, 4.0));
entryList.add(new ValueObject(10, 4.0));
List responseList = service.groupToRange(entryList);
responseList.forEach(obj-> System.out.println(obj.toString()));
assertNotNull(responseList);
assertEquals(3, responseList.size());
}
}
我还没有找到使用 java 8 和收集器的方法
【问题讨论】:
-
是的,你编写软件来做这件事。在将您的问题抛给他人为您解决之前,请投入最少的精力。
-
对不起,我已经这样做了。但我想知道是否有办法使用 Collectors groupingBy。
-
提供的 ValueObject 定义无法编译。
-
抱歉,我已修复。我也提供了单元测试。
标签: java collections lambda java-8 java-stream