java8:Stream.filter---(以及.map .concat .sort .limit .skip)的用法,以及与循环遍历的区别

本文通过实例对比了传统循环与 Java 8 中 Stream API 的使用方法,展示了如何利用 Stream 进行数据过滤和转换,使代码更简洁高效。

前言:
在没有接触java8的时候,我们遍历一个集合都是用循环的方式,从第一条数据遍历到最后一条数据,现在思考一个问题,为什么要使用循环,因为要进行遍历,但是遍历不是唯一的方式,遍历是指每一个元素逐一进行处理(目的),而并不是从第一个到最后一个顺次处理的循环,前者是目的,后者是方式。 所以为了让遍历的方式更加优雅,出现了流(stream)!

1.流的目的在于强掉做什么
假设一个案例:将集合A根据条件1过滤为子集B,然后根据条件2过滤为子集C

在没有引入流之前我们的做法可能为:

public class Demo02NormalFilter { 

       public static void main(String[] args) { 

           List<String> list = new ArrayList<>(); 

           list.add("张无忌"); 

           list.add("周芷若"); 

           list.add("赵敏"); 

           list.add("张强"); 

           list.add("张三丰"); 

           List<String> zhangList = new ArrayList<>(); 

           for (String name : list) { 

               if (name.startsWith("张")) { 

                   zhangList.add(name); 

               } 

           } 

     

           List<String> shortList = new ArrayList<>(); 

           for (String name : zhangList) { 

               if (name.length() == 3) { 

                   shortList.add(name); 

               } 

           } 

     
           for (String name : shortList) { 

               System.out.println(name); 

           } 

       } 

现在以流的方式实现同样的功能:

  public static void main(String[] args) { 
    List<String> list = new ArrayList<>();
    list.add("张无忌");
    list.add("周芷若");
    list.add("赵敏");
    list.add("张强");
    list.add("张三丰");
    list.stream().filter(s->s.startsWith("张")).filter(s-> s.length() == 3).forEach(System.out::println);

从上面的两段代码可以看出流的存在让代码更加优雅。既然是筛选那么就直接用过滤方法就好了。

2.stream的方法

2.1 延迟方法:
这个和lambda表达式的延迟加载的原理一样,它可以进行链式编程,比如 ().filter().map().limit(),可以点下去,到最后一步(方法为count或者foreach)加载数据。这里主要介绍map和concat方法

1.filter,用来过滤

 Stream<String> original = Stream.of("张无忌", "张三丰", "周芷若");
    Stream<String> result = original.filter(s -> s.startsWith("张"));
    result.forEach(name-> System.out.println(name));

2.map
将流中的元素映射到另一个流中,这个是在后期经常用到的,比如方法所接收的返回值是A,但是接收的却是B
这里举两个例子

例子1
将String类型的流转换为Integer 类型

 Stream<String> stringStream = Stream.of("1", "2", "3", "4", "5", "6");
    stringStream.map(str->Integer.parseInt(str)).forEach(System.out::println);

例子2
方法需要返回的是List ,但是这里只有List,此时就要想到stream().map

   public  List<String> queryNamesByIds(List<Long> ids){
        List<Category> categories = this.categoryMapper.selectByIdList(ids);
       return  categories.stream().map(category -> category.getName()).collect(Collectors.toList());
    }

例子3
List转化为List,其中List中的Object为Cart的json对象

 //查询购物车数据(将List<Object>变成List<Cart>)
    return carts.stream().map(o -> JsonUtils.parse(o.toString(),Cart.class)).collect(Collectors.toList());

3.contract,两个流合并成一个流

 	Stream<String> streamA = Stream.of("张无忌","张翠山");
    Stream<String> streamB = Stream.of("美羊羊","喜羊羊");
    
    //写法1
    //Stream.concat(streamA, streamB).forEach(System.out::println);
    //写法2
   Stream<String> result=  Stream.concat(streamA, streamB);
   result.forEach(name-> System.out.println(name));

2.2 终结方法:
执行完的结果不能在调用延迟方法。 如 ().filter().count().limit()这样的写法就会报错。
cout方法与foreach方法比较简单,这里不介绍了

通过使用filter和循环遍历,分别实现方法对相同数据进行测试
测试发现,数据量较小时,遍历速度更快,数据量较大时,filter速度更快**

转自:https://blog.csdn.net/jerry11112/article/details/101376162

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值