62,630
社区成员




class Student {
private String id;
private BigDecimal chinese;
private BigDecimal math;
private BigDecimal english;
public Student(String id, BigDecimal chinese, BigDecimal math, BigDecimal english) {
super();
this.id = id;
this.chinese = chinese;
this.math = math;
this.english = english;
}
}
public static void main(String[] args) {
Student zhangsan = new Student("zhangsan", new BigDecimal("87"), new BigDecimal("52"), new BigDecimal("36"));
Student lisi = new Student("lisi", new BigDecimal("91"), new BigDecimal("83.2"), new BigDecimal("78"));
Student wangwu = new Student("wangwu", new BigDecimal("100"), new BigDecimal("64"), new BigDecimal("73"));
Student zhaoliu = new Student("zhaoliu", new BigDecimal("99"), new BigDecimal("92"), new BigDecimal("91"));
List<Student> studentList = new ArrayList<Student>();
studentList.add(zhangsan);
studentList.add(lisi);
studentList.add(wangwu);
studentList.add(zhaoliu);
// 单科成绩 可以进行汇总计算
BigDecimal sum = studentList.stream().map(student -> student.getChinese()).reduce(BigDecimal.ZERO,
BigDecimal::add);
System.out.println("语文总成绩:" + sum.toEngineeringString());
// 多科成绩分别汇总中reduce如何处理?
studentList.stream().map(student -> new BigDecimal[] {student.getChinese(), student.getMath(), student.getEnglish()})
.reduce(new BigDecimal[] {BigDecimal.ZERO,BigDecimal.ZERO,BigDecimal.ZERO}, BigDecimal::add);
}
private static BigDecimal calculate(List<Student> studentList, Function<Student,BigDecimal> function){
return studentList.stream().map(student -> function.apply(student)).reduce(BigDecimal.ZERO,
BigDecimal::add);
}
调用方法:
calculate(studentList,Student::getChinese)
方法二:反射
private static <T> Map<String, BigDecimal> calulateMap(List<T> studentList, Class<T> tClass) throws Exception {
Field[] declaredFields = tClass.getDeclaredFields();
Map<Field, BigDecimal> map = new HashMap<>();
for (Field field : declaredFields) {
if (field.getType().equals(BigDecimal.class)) {
field.setAccessible(true);
map.put(field, BigDecimal.ZERO);
}
}
Set<Map.Entry<Field, BigDecimal>> entries = map.entrySet();
for (T t : studentList) {
for (Map.Entry<Field, BigDecimal> entry : entries) {
entry.setValue(entry.getValue().add((BigDecimal) entry.getKey().get(t)));
}
}
Map<String, BigDecimal> resultMap = new HashMap<>();
map.entrySet().stream().forEach((k) -> resultMap.put(k.getKey().getName(), k.getValue()));
return resultMap;
}
调用方法:
calulateMap(studentList,Student.class)
执行结果:
{chinese=377, english=278, math=291.2}BigDecimal[] reduce = studentList.stream().map(student -> new BigDecimal[]{student.getChinese(), student.getMath(), student.getEnglish()})
.reduce(new BigDecimal[]{BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO}, (a, b) -> {
for (int i = 0; i < a.length; i++) {
b[i] = b[i].add(a[i]);
}
return b;
});
你定义的一个数组来收集结果,本质上还是要遍历,这样做意义大吗?