java8新特性-Steam流漫谈
admin
2024-01-17 06:13:13

使用stream流能够更加优美,真正做到像写诗一样写代码。

为什么使用stream

  • 可以更方便的操作集合
  • 减少代码量
  • 更加优雅

如何使用

基础使用

首先我们定义一个String集合或者数组,演示如何创建流:

// List集合
List list = new ArrayList<>();
Stream stream = list.stream();

创建流很简单,使用.stream()方法即可创建,接下来我们添加几个人名到集合中:

// List集合
List list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");

随后我们面临一个需求,需要找出对应姓的人,比如我要找出姓张的人,这个时候我们不借助流,实现的逻辑如下:

List result = new ArrayList<>();
list.forEach(e->{if (e.startsWith("张")){result.add(e);}
});

使用forEach,写个if判断能够实现效果,这个时候我们借助流的实现效果如下:

// 定义接收结果集
List result = new ArrayList<>();
list.stream().filter(e -> e.startsWith("张")).forEach(e -> result.add(e));// 更加简约的写法
List resultList = list.stream().filter(e -> e.startsWith("张")).collect(Collectors.toList());

基本上一行就表达清楚了,而且与上面实现的效果一致,如果有多个过滤条件还可以继续使用.filter()方法进行叠加使用。

上面我们接触了流的filter()过滤器功能,还存在其他的使用方法:

  • limit(long maxSize)

    获取集合前几个属性

    // 初始化List集合
    List list = new ArrayList<>();
    list.add("张三");
    list.add("李四");
    list.add("王五");
    // 获取集合前2个属性,结果:张三 李四
    List collect = list.stream().limit(2).collect(Collectors.toList());
    
  • skip(long n)

    跳过指定的前面几个元素

    // 初始化List集合
    List list = new ArrayList<>();
    list.add("张三");
    list.add("李四");
    list.add("王五");
    // 跳过前面2个元素,结果:王五
    List collect = list.stream().skip(2).collect(Collectors.toList());
    
  • distinct()

    元素去重

    // 初始化List集合
    List list = new ArrayList<>();
    list.add("张三");
    list.add("李四");
    list.add("王五");
    // 增加一个重复元素 张三
    list.add("张三");
    // 去重处理,将重复元素[张三]剔除,结果:张三 李四 王五
    List collect = list.stream().distinct().collect(Collectors.toList());
    
  • sorted()

    排序

    // 初始化List集合
    List list = new ArrayList<>();
    list.add("张三");
    list.add("李四");
    list.add("王五");
    list.add("张三");
    list.add("张三丰");
    // 使用默认排序,结果:张三 张三 李四 王五
    List collect = list.stream().sorted().collect(Collectors.toList());// 使用自定义排序,结果:诸葛孔明 张三丰 张三 李四 王五 张三
    List collect2 = list.stream().sorted(new Comparator() {@Overridepublic int compare(String o1, String o2) {// 根据名字长度倒序排序return o2.length() - o1.length();}
    }).collect(Collectors.toList());
    
  • allMatch(Predicate predicate)

    判断集合中是否有符合条件的属性

    List list = new ArrayList<>();
    list.add("张三");
    list.add("李四");
    list.add("王五");// 判断集合中是否有姓张的属性,结果:true
    boolean flagging = list.stream().allMatch(e -> e.startsWith("张"));
    

进阶使用

参考资料:

  • Java8新特性之Steam流详解
  • java中steam流的使用

相关内容

热门资讯

AI内容有误网友索赔9999被... 【#AI内容有误网友索赔9999被法院驳回#】#AI霸气喊话赔你10万你还真信#2025年6月,梁某...
上海任命一位副市长 据澎湃新闻消息,1月30日,上海市十六届人大常委会第二十八次会议举行。会议审议并表决通过有关人事任免...
涉嫌逃逸找人顶包?金晨道歉:助... 1月29日,演员金晨被曝涉嫌交通肇事逃逸、指使助理顶包并企图骗保,相关爆料迅速席卷全网,引发社会热议...
证监会:拟扩大战略投资者类型,... 中国证监会就《关于修改〈《上市公司证券发行注册管理办法》第九条、第十条、第十一条、第十三条、第四十条...
最新或2023(历届)广东培正... 广东培正学院新生入学后就要开始准备大学新生军训了,其实大学生军训中也有很多注意事项。那大学生军训中需...