一.前期准备
测试类:
/**
*测试类
*/
@Getter
@Setter
@ToString
public class EquipmentDto {
@ApiModelProperty("物资名称")
private String name;
@ApiModelProperty("编号")
private int number;
@ApiModelProperty("数量")
private int quantity;
@ApiModelProperty("含税单价")
private BigDecimal price;
public EquipmentDto (String name,int number,int quantity,BigDecimal price){
this.name=name;
this.number =number;
this.quantity=quantity;
this.price=price;
}
测试数据:
List<EquipmentDto> list = new ArrayList<>();
static{
list.add(new EquipmentDto ("设备1",1001,3,25));
list.add(new EquipmentDto ("设备2",1003,1,12));
list.add(new EquipmentDto ("设备3",1002,7,55));
list.add(new EquipmentDto ("设备4",1007,2,34));
}
二.List集合之各种操作与转换
大致包含以下内容:
遍历(5种方式)
排序(普通排序、单/多属性排序)
转Map
分组
去重(对象属性去重)
提取
过滤(单条件、多条件)
取值(平均值、最大/最小值、求和)
1.遍历
(1) list.forEach(dto-> { System.out.println(dto); });
(2)list.forEach(System.out::println);
(3)for (EquipmentDto dto: list) { System.out.println(dto); }
(4)for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); }
(5)Iterator<EquipmentDto> iterator = list.iterator(); while (iterator.hasNext()) { EquipmentDto next = iterator.next(); System.out.println(next); }
2.排序
2.1 普通排序
//普通list
List<Integer> ids = new ArrayList<Integer>() {{
add(1);
add(5);
add(8);
add(3);
}};
//升序
Collections.sort(ids);
//降序
ids.sort(Comparator.reverseOrder());
2.2对象属性排序
2.2.1单属性排序
// 1.根据数量升序
List<EquipmentDto> quantityAscList = list.stream()
.sorted(Comparator.comparing(EquipmentDto::getQuantity)).collect(Collectors.toList());
// 2.根据数量降序
List<EquipmentDto> quantityDescList = list.stream()
.sorted(Comparator.comparing(EquipmentDto::getQuantity).reversed()).collect(Collectors.toList());
2.2.1多属性排序
//根据数量正序且编号倒叙
List<EquipmentDto> sortedByQuantityAndNumber = list.stream()
.sorted(Comparator.comparing(EquipmentDto::getQuantity).
thenComparing(EquipmentDto::getNumber,Comparator.reverseOrder()))
.collect(Collectors.toList());
总结:
Comparator.comparing(类::属性一).reversed(); 得到排序结果后再排序
Comparator.comparing(类::属性一,Comparator.reverseOrder());是直接进行排序
3.转Map
/**
* List -> Map
* 需要注意的是:toMap 如果集合对象有重复的key,会报错Duplicate key ....
* 可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
*/
Map<Integer, EquipmentDto> dtoMap = list.stream()
.collect(Collectors.toMap(EquipmentDto::getNumber, a -> a, (k1, k2) -> k1));
4.分组
//根据编号分组
Map<Integer, List<EquipmentDto>> result =
list.stream().collect(Collectors.groupingBy(EquipmentDto::getNumber));
5.去重
5.1普通集合去重
List<String> stringList = new ArrayList<String>() {{
add("A");
add("A");
add("B");
add("B");
add("C");
}};
//去重后
stringList = stringList.stream().distinct().collect(Collectors.toList());
5.1对象属性去重
//根据编号去重
List<EquipmentDto> resultList = list.stream().collect(
Collectors.collectingAndThen(Collectors.toCollection(()
-> new TreeSet<>(Comparator.comparing(EquipmentDto::getNumber))), ArrayList::new));
6.提取
//提取编号
List<Integer> numberList = list.stream()
.map(EquipmentDto::getNumber) //流转化为Integer,方法引用写法
.distinct() // 去重 处理
.collect(Collectors.toList()); //输出流收集回List中,为空的情况下返回空集合
7.过滤
7.1单条件过滤
//过滤出价钱 <30 的设备
List<EquipmentDto> priceFilterList = list.stream()
.filter(dto-> dto.getPrice() < 30) // 只过滤出 <30 的设备
.collect(Collectors.toList()); //输出流收集回List中,为空的情况下返回空集合
7.2多条件过滤
List<EquipmentDto> filterList = list.stream()
.filter(dto-> { //多种条件过滤
if (30 >= dto.getPrice() && "设备1".equals(dto.getName())) {
return true;
}
return false;
}).collect(Collectors.toList()); //输出流收集回List中,为空的情况下返回空集合
8.取值
8.1平均数
// 平均数
double asDouble = list.stream().mapToLong(EquipmentDto::getQuantity).average().getAsDouble();
double avg = list.stream().collect(Collectors.averagingLong(EquipmentDto::getQuantity));
8.2最大值
// 最大值
long asLong = list.stream().mapToLong(EquipmentDto::getQuantity).max().getAsLong();
System.out.println("max:" + asLong);
8.3最小值
// 最小值
long asLong1 = list.stream().mapToLong(EquipmentDto::getQuantity).min().getAsLong();
System.out.println("min:" + asLong1);
8.4求和
// 求数量和
long sum1 = list.stream().mapToLong(EquipmentDto::getQuantity).sum();
System.out.println("sum:" + sum1);
//求价钱和
BigDecimal totalPrice = list.strem().map(EquipmentDto::getPrice).reduce(BigDecimal.ZERO,BigDecimal::add);
————————————————
参考链接:https://blog.csdn.net/qq_38011415/article/details/107897510