Java8_关于list集合的操作Stream

一、前言

    list的遍历在日常编程中,应用非常普遍,在Java8中,对list集合的操作做了书写上的简化,使代码更简洁。

    在没有这些以前,我们写list的遍历是这样的

for(int i = 0;i<numList.size();i++){
    System.out.println(numList.get(i));
}

或者是这样的

for(Integer num : numList){
    System.out.println(num);
}

要做list的筛选,去重,求差,求并等操作就比较繁琐了,而Java8给我们带来新特性,是我们在做list集合操作时,非常简单。

二、举例子

有两个这样的集合

List<Integer> numList = new ArrayList();
numList.add(1);
numList.add(0);
numList.add(125);
numList.add(99);
numList.add(99);
numList.add(88);
//person有两个属性,一个是名称,一个是工作
List<Person> personList = new ArrayList<>();
personList.add(new Person("小红","程序员"));
personList.add(new Person("小明","程序员"));
personList.add(new Person("小雷","测试"));
personList.add(new Person("小泰","UI"));

2.1 list的遍历

遍历list元素

numList.forEach(num -> System.out.println(num));

2.2 list中每个元素做相同操作

将list中的每个元素乘2,变成新的集合

List<Integer> numListAfterCal = numList.stream().map(num->num*2).collect(Collectors.toList());

方法解析:

  • stream():把集合转成了流
  • map():接收一个函数作为参数, 把流里面的每个元素都执行一遍,并将其映射成一个新的元素。
  • collect(Collectors.toList()):将结果转换成list

2.3 list元素筛选

筛选出小于200的元素,变成新的集合或者输出

List<Integer> numListAfterCal = numList.stream()
      .map(num -> num * 2)
      .filter(num -> num < 200)
      .collect(Collectors.toList());

方法解析: 

  • filter()  :筛选出满足条件的数据
numList.stream()
    .map(num -> num * 2)
    .filter(num -> num < 200)
    .forEach(num -> {
        System.out.println(num);
    });

2.4 得到首个匹配到的结果

得到首个匹配到的结果

Optional<Integer> a = numList.stream()
      .map(num -> num * 2)
      .filter(num -> num < 200)
      .findFirst();

2.6 去重、跳过元素、取元素数量

List<Integer> strListDistinct = numList.stream()
       .distinct() //[1,0,125,99,88]
       .skip(2) //[125,99,88]
       .limit(2) //[125,99]
       .collect(Collectors.toList());

方法解析: 

  • distinct():通过流中元素的 hashCode() 和 equals() 去除重复元素
  • limit(n):获取n个元素
  • skip(n):跳过n元素

2.5 list转成map

将personList按照工作类型分组

Map<String,List<Person>> map = personList.stream()
       .collect(Collectors.groupingBy(Person::getJob));

得到结果如下:

{
    "程序员": [
        {
            "name": "小红",
            "job": "程序员"
        },
        {
            "name": "小明",
            "job": "程序员"
        }
    ],
    "测试": [
        {
            "name": "小雷",
            "job": "测试"
        }
    ],
    "UI": [
        {
            "name": "小泰",
            "job": "UI"
        }
    ]
}

取出name和job组成一个map集合

 Map<String, String> personMap = personList.stream()
                .collect(Collectors.toMap(p -> p.getName(), p -> p.getJob()));

得到结果如下:

{"小雷":"测试","小泰":"UI","小明":"程序员","小红":"程序员"}

 2.6 集合元素抽取出来,形成新集合

将personList中的人名抽取出来形成新的集合

List<String> list = personList.stream()
        .map(Person::getName)
        .collect(Collectors.toList());

如果需要对结果去重,加上.distinct()

List<String> list = personList.stream()
        .map(Person::getName)
        .distinct()
        .collect(Collectors.toList());

得到结果如下:

["小红","小明","小雷","小泰"]

stream()优点

无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。

为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。

惰式执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。

可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值