一.前期準(zhǔn)備
測(cè)試類:
/**
*測(cè)試類
*/
@Getter
@Setter
@ToString
public class EquipmentDto {
@ApiModelProperty("物資名稱")
private String name;
@ApiModelProperty("編號(hào)")
private int number;
@ApiModelProperty("數(shù)量")
private int quantity;
@ApiModelProperty("含稅單價(jià)")
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;
}
測(cè)試數(shù)據(jù):
List<EquipmentDto> list = new ArrayList<>();
static{
list.add(new EquipmentDto ("設(shè)備1",1001,3,25));
list.add(new EquipmentDto ("設(shè)備2",1003,1,12));
list.add(new EquipmentDto ("設(shè)備3",1002,7,55));
list.add(new EquipmentDto ("設(shè)備4",1007,2,34));
}
二.List集合之各種操作與轉(zhuǎn)換
大致包含以下內(nèi)容:
遍歷(5種方式)
排序(普通排序、單/多屬性排序)
轉(zhuǎn)Map
分組
去重(對(duì)象屬性去重)
提取
過(guò)濾(單條件、多條件)
取值(平均值、最大/最小值、求和)
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對(duì)象屬性排序
2.2.1單屬性排序
// 1.根據(jù)數(shù)量升序
List<EquipmentDto> quantityAscList = list.stream()
.sorted(Comparator.comparing(EquipmentDto::getQuantity)).collect(Collectors.toList());
// 2.根據(jù)數(shù)量降序
List<EquipmentDto> quantityDescList = list.stream()
.sorted(Comparator.comparing(EquipmentDto::getQuantity).reversed()).collect(Collectors.toList());
2.2.1多屬性排序
//根據(jù)數(shù)量正序且編號(hào)倒敘
List<EquipmentDto> sortedByQuantityAndNumber = list.stream()
.sorted(Comparator.comparing(EquipmentDto::getQuantity).
thenComparing(EquipmentDto::getNumber,Comparator.reverseOrder()))
.collect(Collectors.toList());
總結(jié):
Comparator.comparing(類::屬性一).reversed(); 得到排序結(jié)果后再排序
Comparator.comparing(類::屬性一,Comparator.reverseOrder());是直接進(jìn)行排序
3.轉(zhuǎn)Map
/**
* List -> Map
* 需要注意的是:toMap 如果集合對(duì)象有重復(fù)的key,會(huì)報(bào)錯(cuò)Duplicate key ....
* 可以用 (k1,k2)->k1 來(lái)設(shè)置,如果有重復(fù)的key,則保留key1,舍棄key2
*/
Map<Integer, EquipmentDto> dtoMap = list.stream()
.collect(Collectors.toMap(EquipmentDto::getNumber, a -> a, (k1, k2) -> k1));
4.分組
//根據(jù)編號(hào)分組
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對(duì)象屬性去重
//根據(jù)編號(hào)去重
List<EquipmentDto> resultList = list.stream().collect(
Collectors.collectingAndThen(Collectors.toCollection(()
-> new TreeSet<>(Comparator.comparing(EquipmentDto::getNumber))), ArrayList::new));
6.提取
//提取編號(hào)
List<Integer> numberList = list.stream()
.map(EquipmentDto::getNumber) //流轉(zhuǎn)化為Integer,方法引用寫法
.distinct() // 去重 處理
.collect(Collectors.toList()); //輸出流收集回List中,為空的情況下返回空集合
7.過(guò)濾
7.1單條件過(guò)濾
//過(guò)濾出價(jià)錢 <30 的設(shè)備
List<EquipmentDto> priceFilterList = list.stream()
.filter(dto-> dto.getPrice() < 30) // 只過(guò)濾出 <30 的設(shè)備
.collect(Collectors.toList()); //輸出流收集回List中,為空的情況下返回空集合
7.2多條件過(guò)濾
List<EquipmentDto> filterList = list.stream()
.filter(dto-> { //多種條件過(guò)濾
if (30 >= dto.getPrice() && "設(shè)備1".equals(dto.getName())) {
return true;
}
return false;
}).collect(Collectors.toList()); //輸出流收集回List中,為空的情況下返回空集合
8.取值
8.1平均數(shù)
// 平均數(shù)
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求和
// 求數(shù)量和
long sum1 = list.stream().mapToLong(EquipmentDto::getQuantity).sum();
System.out.println("sum:" + sum1);
//求價(jià)錢和
BigDecimal totalPrice = list.strem().map(EquipmentDto::getPrice).reduce(BigDecimal.ZERO,BigDecimal::add);
————————————————
參考鏈接:https://blog.csdn.net/qq_38011415/article/details/107897510