JAVA8新特性之List的各种⽤法(最⼤、最⼩、平均值、分组、
求和、遍历、过滤、排序)
构建⼀个User实体类供演⽰
public class Users {
/**
* ID
*/
private Long id;
/**
* ⽤户名
*/
private String name;
/**
* 年龄
*/
private int age;
/**
* ⼯号
*/
private String jobNumber;
/**
* 性别
*/
private String sex;
/**
* 注册时间
*/
private Date entryDate;
/**
* 成员组织
*/
private BigDecimal familyMemberQuantity;
private Long userId;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getJobNumber() {
return jobNumber;
}
public void setJobNumber(String jobNumber) {
this.jobNumber = jobNumber;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getEntryDate() {
return entryDate;
}
public void setEntryDate(Date entryDate) {
}
public BigDecimal getFamilyMemberQuantity() {
return familyMemberQuantity;
}
public void setFamilyMemberQuantity(BigDecimal familyMemberQuantity) {
this.familyMemberQuantity = familyMemberQuantity;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
@Override
public String toString() {
return "Users{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", jobNumber='" + jobNumber + '\'' +
", sex='" + sex + '\'' +
", entryDate=" + DateFormatUtils.format(entryDate, "yyyy-MM-dd HH:mm:ss") +
", familyMemberQuantity=" + familyMemberQuantity +
'}';
}
}
⼀、根据字段分组得到多个List集合
构建⼀个产⽣Users的静态法
/**
* ⽣产虚拟⽤户
*
* @return
*/
public static List<Users> produceUser() {
List<Users> usersList = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
Users users = new Users();
users.setId(Long.valueOf(i));
users.setName("kobe" + i);
users.setAge(15 + new Random().nextInt(5));
users.setJobNumber("jobNumber" + i);
if (i % 2 == 0) {
users.setSex("男");
} else {
users.setSex("⼥");
}
users.setEntryDate(new Date());
users.setFamilyMemberQuantity(new BigDecimal(i));
usersList.add(users);
}
return usersList;
}
利⽤Java8 特性,根据对象的某个属性进⾏分组
@Test
public void groupByGender() {
List<Users> list = produceUser();
// 根据性别进⾏分组
Map<String, List<Users>> collect = list.stream().upingBy(Users::getSex)); Set<Map.Entry<String, List<Users>>> entries = Set();
entries.forEach(item -> {
// 性别男 / ⼥
String gender = Key();
// 男集合 / ⼥集合
List<Users> usersList = Value();
System.out.println(gender);
usersList.forEach(user -> System.out.println(user));
});
}
输出结果如下
⼆、集合求和
2.1 根据对象中的某个字段求和
/**
* 根据年龄字段求总和
*/
@Test
public void getSumByStream() {
List<Users> list = produceUser();
int sum = list.stream().mapToInt(Users::getAge).sum();
System.out.println("共计:" + list.size() + "个⽤户,所有年龄总和为:" + sum);
// 求最⼤年龄
Integer integer = list.stream().map(Users::getAge).max(Integer::compareTo).get();
System.out.println(integer);
// 得到最⼤年龄对象
Users users = list.stream().max(ComparatorparingInt(Users::getAge)).get();
System.out.println(users);
// 求平均年龄
System.out.println(list.stream().mapToInt(Users::getAge).average().getAsDouble());
/
/ 求最⼤年龄
System.out.println(list.stream().mapToInt(Users::getAge).max().getAsInt());
}
输出结果如下
2.2 List<;数值型> 求和
/**
* 根据List求和
*/
@Test
public void getListSumByJava8() {
List<Integer> listInt = new ArrayList();
List<Double> listDoub = new ArrayList();
for (int i = 0; i < 500; i++) {
listInt.add(new Random().nextInt(1000));
listDoub.add(new Random().nextDouble());
}
System.out.println("=======数值型Integer求和======");
Integer integer = listInt.stream().reduce(Integer::sum).orElse(0);
System.out.println(integer);
System.out.println("=======数值型Double求和======");
Double integer1 = listDoub.stream().reduce(Double::sum).orElse(0.00);
System.out.println(integer1);
// 取最⼤值
System.out.println(listInt.stream().reduce(Integer::max).orElse(0));
System.out.println(listInt.stream().mapToInt(Integer::valueOf).max().getAsInt());
// 取最⼩值
System.out.println(listInt.stream().reduce(Integer::min).orElse(0));
// 取平均值
System.out.println(listInt.stream().mapToInt(Integer::valueOf).average().getAsDouble());
}
输出结果如下
三、遍历List集合
/**
* 遍历对象
*/
@Test
public void traverseByJava8(){
List<Users> list = produceUser();
list.forEach(System.out::println);
}
输出结果如下
四、过滤List集合
/**
* 过滤对象
*/
@Test
public void filterByJava8() {
List<Users> list = produceUser();
System.out.println("原始数据为:");
System.out.println("==============过滤后的数据为===============");
list.forEach(System.out::println);
//筛选出年龄⼤于3岁⼩于8岁的对象
List<Users> collect = list.stream().filter(s -> s.getAge() > 13 && s.getAge() < 18).List()); System.out.println("过滤结束后的数据为:");
collect.forEach(System.out::println);
}
输出结果如下
五、获取List中的最⼤最⼩值
5.1 根据特定需求中的某个字段求最⼤最⼩
/**
* 求最⼤最⼩值,根据业务类型选择合适的类型值
*/
@Test
public void maxOrMinByJava8() {
List<Users> list = produceUser();
//根据mapTO**得到最⼤最⼩ ---写法⼀
double asDouble = list.stream().mapToDouble(Users::getAge).max().getAsDouble(); System.out.println("将最⼤值转换为Double类型进⾏展⽰,最⼤为:" + asDouble);
double asDouble1 = list.stream().mapToDouble(Users::getAge).min().getAsDouble(); System.out.println("将最⼩值转换为Double类型进⾏展⽰,最⼩为:" + asDouble1);
int asInt = list.stream().mapToInt(Users::getAge).max().getAsInt();
System.out.println("将最⼤值转换为Int类型进⾏展⽰,最⼤为:" + asInt);
//根据map得到最⼤最⼩ ---写法⼆(推荐)
Integer integer = list.stream().map(Users::getAge).max(Integer::compareTo).get();
System.out.println("将最⼤值转换为字段对应类型进⾏展⽰,最⼤为:" + integer);
Integer integer1 = list.stream().map(Users::getAge).min(Integer::compareTo).get();
System.out.println("将最⼩值转换为字段对应类型进⾏展⽰,最⼩为:" + integer1);
}
输出结果如下
5.2 根据特定需求中的某个字段求平均值
/**
* 求最⼤最⼩值,根据业务类型选择合适的类型值
*/
@Test
public void avgByJava8() {
List<Users> list = produceUser();
double avgAge = list.stream().mapToDouble(Users::getAge).average().getAsDouble(); System.out.println("平均年龄为:" + avgAge);
bigdecimal转换为integer}
输出结果如下
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论