本片文章对流相关操作进行了一些整理
准备工作
首先准备一个Product类和一个 Order类
- Product
/**
* @Description 产品类
* @author corey
* @version $Id: Product.java, v 0.1 2021-10-09 18:01 corey Exp $$
*/
@Getter
@Setter
public class Product {
private String id;
private String productNo;
}
复制代码
- Order
/**
* @Description 订单类
* @author corey
* @version $Id: Order.java, v 0.1 2021-10-09 18:03 corey Exp $$
*/
@Getter
@Setter
public class Order {
private String name;
private String age;
private String sex;
}
复制代码
总结
日常开发中有很多场景需要对List集合进行取值筛选
1.遍历-foreach
list.forEach(orders->{
System.out.println(orders.getName());
});
复制代码
输出结果
2.筛选List
筛选age 大于22的name
List<Order> resultList = list.stream().filter(orderlist -> orderlist.getAge() > 22).collect(Collectors.toList());
resultList.stream().forEach(orderss -> {
System.out.println(orderss.getName());
});
复制代码
结果为:
3.list去重
更具性别去重
ArrayList<Order> collectUnlike = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()
-> new TreeSet<>(Comparator.comparing(Order::getSex))), ArrayList::new));
collectUnlike.forEach(orderR ->{
System.out.println(orderR.getName());
});
复制代码
结果为
3.取出list集合对象中某一属性
取出对象中的每一个名字,然后组成一个新集合
//取出list中每个对象中姓名组成一个新集合
List<String> nameList = list.stream().map(Order::getName).collect(Collectors.toList());
System.out.println(JSONObject.toJSON(nameList));
复制代码
结果为
3.list与map互转,并根据某一属性进行分组
list与map互相转换
// list转Map 根据性别分组
Map<String, List<Order>> collect = list.stream().collect(Collectors.groupingBy(Order::getSex));
System.out.println(JSONObject.toJSON(collect));
复制代码
结果为 { "女": [ { "sex": "女", "name": "张三", "age": 20 }, { "sex": "女", "name": "李四", "age": 21 }, { "sex": "女", "name": "王八", "age": 25 } ], "未知": [ { "sex": "未知", "name": "赵柳", "age": 24 } ], "男": [ { "sex": "男", "name": "王五", "age": 22 }, { "sex": "男", "name": "赵六", "age": 23 } ] }
4.过滤属性为空的字段
System.out.println("=======================这是分割线=============过滤属性为空的字段===================");
//过滤属性为空的字段
List<String> stringList = list.stream().map(s -> s.getName()).filter(s -> !s.isEmpty()).collect(Collectors.toList());
System.out.println(JSONObject.toJSON(stringList));
复制代码
更具年龄进行计算
System.out.println("=======================这是分割线=============更具年龄进行计算===================");
//根据某一值进行计算
IntSummaryStatistics resultNum = list.stream().mapToInt((item)->item.getAge()).summaryStatistics();
System.out.println("max:"+resultNum.getMax());
System.out.println("min:"+resultNum.getMin());
System.out.println("sum:"+resultNum.getSum());
System.out.println("average:"+resultNum.getAverage());
System.out.println("count:"+resultNum.getCount());
复制代码
结果为
- 这里需要注意的是
1、求和有三种类型,mapToInt,mapToLong,mapToDouble
2、如果是Bigdecimal数值类型,则计算方法如下,(新建对象)
Frult frult1 = new Frult("大哥",new BigDecimal(1));
Frult frult2 = new Frult("二弟",new BigDecimal(2));
List frultList = new ArrayList<>(); frultList.add(frult1);
frultList.add(frult2);
BigDecimal totalPrice = frultList.stream().map(Frult::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
ok常用的总结就如上了,如果有什么错误,欢迎指出,