Java Stream使用方法讲解(最新)

Java Stream 使用方法讲解


前言

Java 8 引入了 Stream,通过声明性的方式增强了集合的功能,使对集合的操作更加简单。Stream可以看成高级迭代器,用于匹配值、筛选元素、分组等操作,类似于数据库操作。与之前繁琐的集合处理相比,Stream简化了代码编写,提高了并发处理的效率,无需额外编写多线程代码。Stream的引入极大地提高了编程效率和程序可读性。


提示:以下是本篇文章正文内容,下面案例可供参考 废话不多说直接上代码

一、以下是一个比较经典的对比代码。对集合简单排序的一个demo,

1.java8之前代码:

List<Demo> groceryDemos = new ArrayList<>();  
for(Demo d: demos){  
  if(d.getType() == Demo.GROCERY){  
    groceryDemos.add(d);  
  }  
}  
Collections.sort(groceryDemos, new Comparator(){  
  public int compare(Demo d1, Demo d2){  
    return d2.getValue().compareTo(d1.getValue());  
  }  
});  
List<Integer> demoIds = new ArrayList<>();  
for(Demo d: groceryDemos){  
  demoIds.add(d.getId());  
}

2.使用Stream之后

上述代码可以直接简化成如下所示的代码:

List<Integer> demoIds =   
    demos.stream()  
         .filter(d -> d.getType() == Demo.GROCERY)  
         .sorted(Comparator.comparing(Demo::getValue).reversed())  
         .map(Demo::getId)  
         .collect(Collectors.toList());

可以很明显的看出,使用Stream之后的确是极大的提高了编程效率和程序可读性。

二、更多例子

  1. 集合自带 Stream 流方法
List<String> list = new ArrayList<>();
// 创建一个顺序流
Stream<String> stream = list.stream();
// 创建一个并行流
Stream<String> parallelStream = list.parallelStream();
  1. 通过 Array 数组创建
int[] array = {1,2,3,4,5};
IntStream stream = Arrays.stream(array);
  1. 使用 Stream 的静态方法创建
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<Integer> stream = Stream.iterate(0, (x) -> x + 3).limit(3); // 输出 0,3,6

Stream<String> stream = Stream.generate(() -> "Hello").limit(3); // 输出 Hello,Hello,Hello
Stream<Double> stream = Stream.generate(Math::random).limit(3); // 输出3个随机数
  1. 数值流
// 生成有限的常量流
IntStream intStream = IntStream.range(1, 3); // 输出 1,2
IntStream intStream = IntStream.rangeClosed(1, 3); // 输出 1,2,3
// 生成一个等差数列
IntStream.iterate(1, i -> i + 3).limit(5).forEach(System.out::println); // 输出 1,4,7,10,13
// 生成无限常量数据流
IntStream generate = IntStream.generate(() -> 10).limit(3); // 输出 10,10,10
另外还有 LongStreamDoubleStream 都有这几个方法。
  1. 使用初始化一些数据,示例中使用。
public class Demo {
    class User{
        // 姓名
        private String name;

        // 年龄
        private Integer age;
    }

    public static void main(String[] args) {
        List<User> users = new ArrayList<>();
        users.add(new User("笑笑", 1));
        users.add(new User("Jerry", 2));
    }
}
  1. 遍历 forEach
// 循环输出user对象
users.stream().forEach(user -> System.out.println(user));
  1. 查找 find
// 取出第一个对象
User user = users.stream().findFirst().orElse(null); // 输出 {"age":1,"name":"笑笑"}
// 随机取出任意一个对象
User user = users.stream().findAny().orElse(null);
  1. 匹配 match
// 判断是否存在name是笑笑的用户
boolean existTom = users.stream().anyMatch(user -> "笑笑".equals(user.getName()));
// 判断所有用户的年龄是否都小于15
boolean checkAge = users.stream().allMatch(user -> user.getAge() < 15);
  1. 筛选 filter
// 筛选name是笑笑的用户
users.stream()
        .filter(user -> "笑笑".equals(user.name))
        .forEach(System.out::println); // 输出 {"age":1,"name":"笑笑"}
  1. 映射 map/flatMap
// 打印users里的name
users.stream().map(User::getName).forEach(System.out::println); // 输出 笑笑Jerry
// List<List<User>> 转 List<User>
List<List<User>> userList = new ArrayList<>();
List<User> users = userList.stream().flatMap(Collection::stream).collect(Collectors.toList());
  1. 归约 reduce
// 求用户年龄之和
Integer sum = users.stream().map(User::getAge).reduce(Integer::sum).orElse(0);
// 求用户年龄的乘积
Integer product = users.stream().map(User::getAge).reduce((x, y) -> x * y).orElse(0);
  1. 排序 sorted
// 按年龄倒序排
List<User> collect = users.stream()
        .sorted(Comparator.comparing(User::getAge).reversed())
        .collect(Collectors.toList());

//多属性排序
List<Person> result = persons.stream()
                .sorted(Comparator.comparing((Person p) -> p.getNamePinyin())
                        .thenComparing(Person::getAge)).collect(Collectors.toList());

各位看官老爷,创作不易点个赞再走呀!

总结

Stream API 是 Java 中用于对集合进行高阶抽象操作的工具,类似于使用 SQL 查询数据库。它提供了一种直观的方式来操作集合,可以极大提高程序员的生产效率,编写高效、清晰、简洁的代码。通过将要处理的元素集合看作一种流,在管道中传输,并在管道的节点上进行筛选、排序、聚合等操作,从而简化了集合操作的复杂性。Stream API 是一种强大的工具,使得对集合的操作更加直观和高效。

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不喝过期茅台

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

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

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

打赏作者

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

抵扣说明:

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

余额充值