Java 8 Stream API的使用

前言

Stream(流)是一个来自数据源的元素队列,它可以支持聚合操作。

● 数据源:流的数据来源,构造Stream对象的数据源,比如通过一个List来构造Stream对象,这个List就是数据源;
● 聚合操作:对Stream对象进行处理后使得Stream对象返回指定规则数据的操作称之为聚合操作,比如filter、map、limit、sorted等都是聚合操作。

Stream 聚合操作

准备一个Person类

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return name;
    }
}

然后根据这个对象,我们构造一些数据

 List<Person> persons =
                Arrays.asList(
                        new Person("Max", 18),
                        new Person("Peter", 23),
                        new Person("Pamela", 23),
                        new Person("David", 12));

filter 操作

对Stream中的元素进行过滤操作,当设置条件返回true时返回相应元素。

  List<Person> filtered=persons.stream()//创建流
                .filter(p->p.name.startsWith("P"))//过滤出名字以p开头的
                .collect(Collectors.toList());//生成一个新的List
        System.out.println(filtered);

map 操作

对Stream中的元素进行转换处理后获取,比如可以将Person对象转换成Long对象。我们经常会有这样的需求:需要把某些对象的id提取出来,然后根据这些id去查询其他对象,这时可以使用此方法。

@Test
public void mapTest(){
    //map操作:获取所有对象的名字
    List<Long> idList = menuList.stream()
    .map(menu -> person.getAge())
    .collect(Collectors.toList());
    LOGGER.info("map操作:{}",idList);
}

limit

从Stream中获取指定数量的元素。

 List<Person> firstFiveList = menuList.stream()
            .limit(5)
            .collect(Collectors.toList());
    LOGGER.info("limit操作:{}",firstFiveList);

Count

仅获取Stream中元素的个数。

@Test
    //count操作:获取所有一级菜单的个数
    long count = menuList.stream()
    .filter(p -> p.age == 18)
    .count();
    LOGGER.info("count操作:{}",count);

sorted

对Stream中元素按指定规则进行排序。

//sorted操作:将所有名字按照sort字段进行排序
    List<Person> sortedList = menuList.stream()
            .sorted((p1,p2)->{return p1.getAge().compareTo(p2.getAge());})
            .collect(Collectors.toList());
    LOGGER.info("sorted操作:{}",sortedList);

Skip

跳过指定个数的Stream中元素,获取后面的元素。

   //skip操作:跳过前5个元素,返回后面的
    List<Person> skipList = menuList.stream()
            .skip(5)
            .collect(Collectors.toList());
    LOGGER.info("skip操作:{}",skipList);

转换方法

这个转换 Map 的思路是将 persons 集合中的每个对象根据年龄分组,如果有不同的人具有相同的年龄,则将这些人的名字用分号连接起来作为一个年龄对应的多个名字的字符串。

 //转换Map集合
        Map<Integer,String> map=persons
                .stream()
                .collect(Collectors.toMap(
                        p->p.age,
                        p->p.name,
                        (name1,name2) -> name1+";"+name2
                ));
        System.out.println(map);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忘忧记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值