JAVA8中Stream的⽤法之最⼤、最⼩、平均值、分组、求和、遍历、过滤、排
JAVA8新特性之List的各种⽤法
所有的代码均以User对象来做案例,有不对或者错误的地⽅请各位J友多多担待和指出.
实体类:
import java.math.BigDecimal;
import java.util.Date;
/**
* 实体类
* @author 12084
* @create 2019-08-05 10:04
*/
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;
public Long getId(){
return id;
}
public void setId(Long id){
this.id = id;
}
public String getName(){
return name;
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
java stream}
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;
}
@Override
public String toString(){
return"Users{"+
"⽤户ID="+ id +
", ⽤户姓名='"+ name +'\''+
", ⽤户年龄="+ age +
", ⽤户⼯号='"+ jobNumber +'\''+
", ⽤户性别='"+ sex +'\''+
", ⽤户注册时间="+ entryDate +
", ⽤户家庭成员数量="+ familyMemberQuantity +
'}';
}
}
⼀、根据字段分组得到多个List集合
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author 12084
* @create 2019-08-05 10:04
*/
public class ListLambdaTest{
public static final Logger logger = Logger(ListLambdaTest.class);
/**
* ⽣产虚拟⽤户
* @return
*/
public  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(i);
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 groupByJava8(){
List<Users> list =produceUser();
//根据性别进⾏分组
Map<String, List<Users>> collect = list.stream().upingBy(Users::getSex));        Set<Map.Entry<String, List<Users>>> entrySet = Set();
//使⽤增强for循环
for(Map.Entry<String, List<Users>> listEntry : entrySet){
//性别男 / ⼥
String sex = Key();
// 男集合 / ⼥集合
List<Users> usersList = Value();
// 下⾯写法跟上⾯Value()⼀致,⽆任何差别
//List<Users> users = (sex);
System.out.println("性别:"+sex);
for(Users users : usersList){
System.out.println(users);
}
}
}
}
1.1 根据性别分组效果如图所⽰
⼆、集合求和
2.1 根据对象中的某个字段求和
/**
* 根据年龄字段求总和
*/
@Test
public void getSumByJava8(){
List<Users> list =produceUser();
//这⾥age属性是int类型可以直接求和
int sum = list.stream().mapToInt(Users::getAge).sum();
//假设这⾥age属性是String类型也可以求和,只不过有个前提,要能转成基本数据类型中的数值型//double sum1 = list.stream().mapToDouble(s -> Integer.Age())).sum();
System.out.println("共计:"+ list.size()+"个⽤户,所有年龄总和为:"+ sum);
}
2.1.1 根据年龄求和效果如图所⽰
2.2 List<;数值型> 求和
/**
* 根据List求和
*/
@Test
public void getListSumByJava8(){
List<Integer> list =new ArrayList();
List<Double> lisst =new ArrayList();
for(int i =1000; i <1500; i++){
list.add(i);
lisst.add((double) i);
}
System.out.println("=======数值型Integer求和======");
Integer integer = list.stream().reduce(Integer::sum).orElse(0);
System.out.println(integer);
System.out.println("=======数值型Double求和======");
Double integer1 = lisst.stream().reduce(Double::sum).orElse(0.00);        System.out.println(integer1);
}
2.2.1 List<;数值型> 求和效果图
三、遍历List集合
/**
* 遍历对象
*/
@Test
public void traverseByJava8(){
List<Users> list =produceUser();
list.stream().forEach(s->{
System.out.String());
});
}
3.1 遍历效果图