Java8 List相关操作

一.前期准备

测试类:

/**
*测试类
*/
@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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容