请查看以下问题。
//Bean Class
public class Test {
private int value;
private int com_id;
/**
* @return the value
*/
public int getValue() {
return value;
}
/**
* @param value the value to set
*/
public void setValue(int value) {
this.value = value;
}
/**
* @return the com_id
*/
public int getCom_id() {
return com_id;
}
/**
* @param com_id the com_id to set
*/
public void setCom_id(int com_id) {
this.com_id = com_id;
}
}
主类
public class Test2 {
public static void main(String[] args) {
Test bean1 = new Test();
Test bean2 = new Test();
Test bean3 = new Test();
Test bean4 = new Test();
Test bean5 = new Test();
//bean1
bean1.setCom_id(1);
bean1.setValue(10);
//bean2
bean2.setCom_id(2);
bean2.setValue(50);
//bean3
bean3.setCom_id(1);
bean3.setValue(30);
//bean4
bean4.setCom_id(1);
bean4.setValue(20);
//bean5
bean5.setCom_id(2);
bean5.setValue(20);
//Arraylist of Test object
ArrayList<Test> alltest = new ArrayList<Test>();
alltest.add(bean1);
alltest.add(bean2);
alltest.add(bean3);
alltest.add(bean4);
alltest.add(bean5);
}
}
现在我想要ArrayList的所有值的总和,其com_id与follow相同 answer_list com_id = 1; val = 60(10 + 30 + 20) com_id = 2; val = 70(50 + 20)
答案 0 :(得分:1)
您可以使用for循环以旧方式执行此操作,或使用Java 8 Streams在一行(非常长)行中执行此操作:
List<Test> aggregated =
alltest.stream()
.collect(Collectors.groupingBy(Test::getCom_id,
Collectors.summingInt(Test::getValue)))
.entrySet()
.stream()
.map(e-> new Test(e->getKey(),e->getValue())
.collect(Collectors.toList());
说明:
第一部分(直到第一个collect
的结尾)应该创建一个Map<Integer,Integer>
,其中键是Test标识符,值是具有相同值的所有Test实例的值的总和标识。
第二部分迭代该Map的条目,然后转换为List of Test实例。
请注意,这需要使用两个参数向Test类添加构造函数。
public Test (int com_id, int value) {
this.com_id = com_id;
this.value = value;
}
这未经过测试,因此可能包含错别字。
答案 1 :(得分:0)
我完全同意,Ankur ......但这里至少有一些暗示:
你想要一些逻辑:
tempVar = 0
for all elements in my List:
if the id of current element is what i need:
add value of current element to tmpVar