import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Test {
public static void main(String[] args) {
Student s1 = new Student("张三", new BigDecimal("28.3"));
Student s2 = new Student("张三", new BigDecimal("25.6"));
Student s3 = new Student("李四", new BigDecimal("27.8"));
List<Student> list = Arrays.asList(s1, s2, s3);
BigDecimal add = list.stream().map(Student::getnum).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2,BigDecimal.ROUND_HALF_UP);
System.out.println(add);
list.stream().collect(Collectors.groupingBy(Student::getName)).forEach( (k,v) ->{
v.stream().forEach(a -> {
a.setRate(a.getnum().divide(add,4,BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toPlainString());
});
});
System.out.println(list);
}
}
class Student{
private String name;
private BigDecimal num;
private String rate;
public Student() {
}
public Student(String name, BigDecimal num) {
this.name = name;
this.num = num;
}
public String getName() {
return name;
}
public BigDecimal getnum() {
return num;
}
public String getRate() {
return rate;
}
public void setName(String name) {
this.name = name;
}
public void setnum(BigDecimal num) {
this.num = num;
}
public void setRate(String rate) {
this.rate = rate;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", num=" + num +
", rate='" + rate + '\'' +
'}';
}
}
BigDecimal在创建的时候最好不要用double,数据会存在精度问题,如果要使用小数类型的数据,可以直接使用String。
reduce内部提供了大量的API,包括加减乘除,最大最小值等,不过reduce只针对于BigDecimal。
groupingBy类似于SQL里面的group by,对集合进行分组,key根据自己的需求进行改动,val就是group by之后的集合。