Java8 新特性StreamAPI

StreamAPI概念

  1. Stream关注的是对数据的运算,跟CPU打交道。集合关注的是数据的存储,与内存打交道
  2. Stream不会存储元素、不会改变源对象、会生成新的流,操作延迟
  3. Stream执行流程
    在这里插入图片描述

StreamAPI的创建

  • 通过集合创建stream流
List<User> users = new ArrayList<>();
Stream<User> stream = users.stream();
  • 通过数组创建
int[] arr = new int[]{1,2,3,4,5};
IntStream stream = Arrays.stream(arr);
  • 通过stream的of()
Stream<Integer> stream = Stream.of(1,2,3,4,5);

StreamAPI的中间操作

1. 筛选与切片

  • filter:过滤
users.stream().filter(user -> user.getAge() >= 20).forEach(System.out::println);
  • limit(n):截断流
users.stream().limit(2).forEach(System.out::println);
  • skip(n):跳过数据
users.stream().skip(1).forEach(System.out::println);
  • distinct():去掉重复项
users.stream().distinct().forEach(System.out::println);

2. 映射

  • map:将元素转成其他形式或提取信息
// 将类中的姓名映射到新的流中
List<User> users = service.getAll();
Stream<String> nameStream = users.stream().map(User::getName);
nameStream.forEach(System.out::println);
  • flatMap: 将一个流里面包含了另外一个流的流,拆分组成一个新的流
    [1,2,3,[4,5,6]] ===> [1,2,3,4,5,6]
@Test
    public void getAllTest(){
        List<User> users = service.getAll();
        Stream<Character> characterStream = users.stream().flatMap(StreamApiTest::characterToStream);
        characterStream.forEach(System.out::println);
    }

    // 将用户姓名拆分成一个个字符,组成一个流
    public static Stream<Character> characterToStream(User user){
        List<Character> ch = new ArrayList<>();
        for (char c : user.getName().toCharArray()) {
            ch.add(c);
        }
        return ch.stream();
    }

3.排序

@Test
    public void getAllTest(){
        List<User> users = service.getAll();
        users.stream().sorted((user1, user2) -> {
            int ageValue = Integer.compare(user1.getAge(), user2.getAge());
            if(ageValue != 0){
                return ageValue;
            }else{
                return Double.compare(user1.getSalary(), user2.getSalary());
            }
        }).forEach(System.out::println);
    }

StreamAPI的终止操作

1.查找匹配

  • allMatch --检测是否匹配所有元素
  • anyMatch --检测是否至少匹配一个
  • noneMatch --检测是否没有匹配的元素
  • findFirst --返回第一个元素
  • findAny --查找任意一个元素
  • count --返回统计的个数
  • max --返回最大值
  • min --返回最小值
  • foreach --遍历

2.规约

  • reduce --可以将流中的元素反复结合起来
Optional<Double> reduceSalary = users.stream().map(User::getSalary).reduce(Double::sum);

3.收集

  • collect --将流转换成其他形式
List<User> collect = users.stream().filter(user -> user.getSalary() > 20000).collect(Collectors.toList());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值