Stream流api的基本使用

1.stream流的定义

Stream是数据渠道,用于操作数据源所生成的元素序列,它可以实现对集合的复杂操作,例如过滤、排序和映射等。 (1)集合是一种静态的数据结构,存储在内存中,而Stream是通过CPU来实现计算的(并不会存储数据) (2)Stream不会改变源对象,而是返回一个新的持有结果的Stream(不可变) (3)Stream流只能使用一次

2.stream流的使用

2.1 stream流的创建

@Test
public void testCreatingStream() {

    //Stream流只能使用一次
    //数组
    String[] str = {"hello", "world"};
    Arrays.stream(str).forEach(s -> System.out.println(s));

    //单列集合
    List<String> list = new ArrayList<>();
    //数组转换成集合
    Arrays.asList(str);
}
复制代码

2.2 stream流过滤filter

/**
 * stream流过滤
 */
@Test
public void testFilter() throws ParseException {

    List<User> users = new ArrayList<User>(10);

    User user1 = new User().builder().id("id001").name("船长").age(23).gender("1").dob(DateUtils.parseDate("1999-10-23", YYYY_MM_DD)).build();
    User user2 = new User().builder().id("id002").name("阿卡丽").age(16).gender("0").dob(DateUtils.parseDate("2006-10-23", YYYY_MM_DD)).build();
    User user3 = new User().builder().id("id003").name("凯南").age(16).gender("1").dob(DateUtils.parseDate("2006-11-11", YYYY_MM_DD)).build();
    User user4 = new User().builder().id("id004").name("沙皇").age(17).gender("1").dob(DateUtils.parseDate("2005-01-18", YYYY_MM_DD)).build();
    User user5 = new User().builder().id("id005").name("妖姬").age(24).gender("0").dob(DateUtils.parseDate("1998-01-18", YYYY_MM_DD)).build();
    User user6 = new User().builder().id("id006").name("剑魔").age(18).gender("1").dob(DateUtils.parseDate("2004-10-23", YYYY_MM_DD)).build();
    User user7 = new User().builder().id("id007").name("猫咪").age(18).gender("0").dob(DateUtils.parseDate("2004-06-23", YYYY_MM_DD)).build();
    User user8 = new User().builder().id("id008").name("青刚影").age(20).gender("0").dob(DateUtils.parseDate("2002-10-23", YYYY_MM_DD)).build();
    User user9 = new User().builder().id("id009").name("盲僧").age(24).gender("1").dob(DateUtils.parseDate("1998-10-23", YYYY_MM_DD)).build();
    User user10 = new User().builder().id("id010").name("露露").age(24).gender("0").dob(DateUtils.parseDate("1998-10-23", YYYY_MM_DD)).build();

    users.add(user1);
    users.add(user2);
    users.add(user3);
    users.add(user4);
    users.add(user5);
    users.add(user6);
    users.add(user7);
    users.add(user8);
    users.add(user9);
    users.add(user10);


    //过滤年龄少于18岁的 使用stream流不用影响原list,使用collect收集器进行收集查找效果
    List<User> collect = users.stream().filter(new Predicate<User>() {
        @Override
        public boolean test(User user) {
            return user.getAge() >= 18;
        }
    }).collect(Collectors.toList());


    //使用stream流不用影响原list
    users.stream().forEach(user -> System.out.println(user));
    System.out.println("----------------------------------------------");
    collect.stream().forEach(user -> System.out.println(user));

}
复制代码

源码中关于filter的说明

/**
 * Returns a stream consisting of the elements of this stream that match
 * the given predicate.
 *
 * <p>This is an <a href="package-summary.html#StreamOps">intermediate
 * operation</a>.
 *
 * @param predicate a <a href="package-summary.html#NonInterference">non-interfering</a>,
 *                  <a href="package-summary.html#Statelessness">stateless</a>
 *                  predicate to apply to each element to determine if it
 *                  should be included
 * @return the new stream
 */
Stream<T> filter(Predicate<? super T> predicate);
复制代码

User实体类

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {

    private String id;

    private String name;

    private Integer age;

    private String gender;

    private Integer score;

    private Date dob;

}

复制代码

2.3 stream流中的映射之list转换成map

/**
 * stream流list转换Map
 */
@Test
public void testMap() throws ParseException {

    List<User> users = new ArrayList<User>(10);

    User user1 = new User().builder().id("id001").name("船长").age(23).gender("1").dob(DateUtils
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值