Java8 List相關(guān)操作

一.前期準(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容