Java - Stream流的使用.

本文深入讲解Java中的Stream流概念,包括其创建方式、常用方法如filter、map、concat等,以及如何将Stream结果收集到集合或数组中。通过具体案例演示了如何利用Stream流进行数据筛选、转换和合并。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Stream: 得益于Lambda所带来的函数式编程, 引入了一个全新的Stream流.

集合/数组转换为流式结构,使用流中的方法进行操作.
“Stream流” 其实是一个集合元素的函数模型,其本身并不存储任何元素。

1.流式思想:

创建一个流式的模式,按照模式对数据进行操作.

2.获取流方式:

a. Stream(): 根据Collection集合获取Stream流. (所有实现类均可获取)
b.Static of(T…Values): 把一些可变参数(底层-数组) 变为Stream流.
c.Map集合也可以先把转为Set集合(keySet , entrySet) , 再用Stram操作.

3.常用方法:

  • 终结方法: 返回值类型不在是Stream    例: count , forEach.
  • 非终结方法: 返回值类型仍然是 Stream ,因此支持链式调用

1.forEach(Consumer<? super T> action): 对Stream流中元素进行遍历.
2.Count(): 统计元素个数 . 返回long , 终止流.
3.filter(Predicate<? super T> predicate): 对Stream流进行过滤.
4.limit(获取个数): 获取前几个.
5.skip(跳过个数): 跳过前几个.
6.map(Function <T,R> fun): 将当前流中的T类型数据转换为另一种R类型的流。
7.concat(Stream a , Stream b) : 将两个流合并为一个流.


函数式接口可参考: https://blog.youkuaiyun.com/qq_42986107/article/details/82502197
注意: 流只能使用一次 , 流被终结之后就不能再使用了,否则就会发生非法状态异常.

4.收集Stream结果:

收集到集合中:
       List集合: Stream.Collect(Collectors.toList()):
       Set集合:Stream.Collect(Collectors . toSet( ) ):
收集到数组中:
       Object[ ] obj = Stream.toArray();
       转换为string[ ]数组:Stream.toArray(new String[3]);

Stream流综合案例:

/* 
  练习:
        现在有两个ArrayList集合存储队伍当中的多个成员姓名,
            1. 第一个队伍只要名字为3个字的成员姓名;存储到一个新集合中
            2. 第一个队伍筛选之后只要前3个人;存储到一个新集合中
            3. 第二个队伍只要姓张的成员姓名;存储到一个新集合中
            4. 第二个队伍筛选之后不要前2个人;存储到一个新集合中
            5. 将两个队伍合并为一个队伍;存储到一个新集合中
            6. 根据姓名创建Person对象;存储到一个新集合中
*/            
 public class Demo02StreamTest {
    public static void main(String[] args) {
        // 第一个队伍 . 
        List<String> one = new ArrayList<>();
        one.add("迪丽热巴"); one.add("宋远桥"); one.add("苏星河");
        one.add("庄子"); one.add("孙子"); one.add("洪七公");

        //  1. 第一个队伍只要名字为3个字的成员姓名;存储到一个新集合中
        //  2. 第一个队伍筛选之后只要前3个人;存储到一个新集合中
        Stream<String> stringStream = one.stream().filter(name -> name.length() == 3).limit(3);

        // 第二个队伍
        List<String> two = new ArrayList<>();
        two.add("古力娜扎");
        two.add("张无忌");
        two.add("张三丰");
        two.add("赵丽颖");
        two.add("张二狗");
        two.add("张天爱");
        two.add("张三");

        // 3. 第二个队伍只要姓张的成员姓名;存储到一个新集合中
        // 4. 第二个队伍筛选之后不要前2个人;存储到一个新集合中
        Stream<String> skip = two.stream().filter(name -> name.startsWith("张")).skip(2);

        // 5. 将两个队伍合并为一个队伍;存储到一个新集合中
        // 6. 根据姓名创建Person对象;存储到一个新集合中
        // 7. 打印整个队伍的Person对象信息。
        Stream.concat(stringStream,skip).map(Person::new).forEach(System.out::println);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值