stream流常见操作(详细)

  1. Filiter   过滤
  2. Limit(long maxSize)&&skip   长度不超过maxSize&&跳过指定数量元素
  3. Concat && distinct    连接两个流&&返回流中的不同元素
  4. Sorted自然排序及comparator   排序
  5. Map流终止操作forEach和count      遍历&&统计
  6. Map&&mapToInt

Lambda表达式

        格式(形式参数)->{代码块},->表示指向动作,代码块表示我们的方法内容。

        形参只有一个可以省略()和参数类型,代码块里只有一条语句的情况下可以省略return。

  • Stream之Filiter

        filter(Predicate<? super T> predicate)

        返回由与此给定谓词匹配的此流的元素组成的。可以起到判断过滤作用

 ArrayList<String> list = new ArrayList<>();
        list.add("张三");
        list.add("猪");
        list.add("猪猪侠");
        list.add("赵孙乾");
        ArrayList<String> list1 = new ArrayList<>();
        //输出姓张的
        list.stream().filter((s)->{
            return s.startsWith("猪");
        }).forEach(System.out::println);
        System.out.println("-----");
       //省略版Lambda
       list.stream().filter(s -> s.startsWith("猪")).forEach(System.out::println);
        System.out.println("-----");
       //输出姓猪的且长度为三的姓名
       list.stream().filter(s->s.startsWith("猪")).filter(s->s.length()==3).forEach(s -> System.out.println(s));

结果:

  • Stream之Limit&&skip ​​​​
limit(long maxSize)

返回由此流的元素组成的,截短长度不能超过 maxSize

skip(long n)

在丢弃流的第一个 n元素后,返回由该流的 n元素组成的

ArrayList<String> list = new ArrayList<>();
        list.add("张三");
        list.add("猪");
        list.add("猪猪侠");
        list.add("王静王");
        list.add("猪侠猪");
        list.add("赵孙乾");

        //取前三个元素
        list.stream().limit(3).forEach(System.out::println);
        System.out.println("----");
        //跳过前两个元素
        list.stream().skip(2).forEach(System.out::println);
        System.out.println("----");
        //跳过前两个 去后面的前三个
        list.stream().skip(2).limit(3).forEach(System.out::println);
        System.out.println("----");

结果:

  • Stream之Concat&&distinct
concat(Stream<? extends T> a, Stream<? extends T> b)

创建一个懒惰连接的流,其元素是第一个流的所有元素,后跟第二个流的所有元素。

distinct()

返回由该流的不同元素(根据 Object.equals(Object) )组成的流。

        //取前三个为第一个流
        Stream<String> stream1 = list.stream().limit(3);
        //取除第一个之后的为第二个流
        Stream<String> stream2 = list.stream().skip(1);
        //合并1 2流
        Stream.concat(stream1,stream2).forEach(System.out::println);
        System.out.println("-----");
        //合并1 2流 并且去除重复元素
        Stream.concat(stream1,stream2).distinct().forEach(s -> System.out.println(s));

结果:

        会发现出现了IllegalStateException错误并且提示流已经被操作或者被关闭

        此时我们需要引出流的三个过程来解释这个问题

  • 生成流:

            通过数据源(集合,数组等)生成流     list.stream()

  • 中间操作:

           一个流中间可以跟零个或者多个中间操作,目的是打开流,经过数据过滤/映射,返回一个新的,交给下一个操作使用。                list.stream.filiter()等

  • 终结操作:

          一个流只能有一个终结操作,操作执行后,流就被用"光"了,无法再被操作,所以这一定是流的最后一个操作。                                       forEach()等

 出现IllegalStateException问题原因:

        所以我们可以找到出现这个问题的原因了。

我们先已经对stream1和stream2进行合并了,所以流已经被用光了

第二次调用就会提示错误

 

  •  Sorted自然排序及comparator
sorted()

返回由此流的元素组成的流,根据自然顺序排序。

sorted(Comparator<? super T> comparator)

返回由该流的元素组成的流,根据提供的 Comparator进行排序。

ArrayList<String> list = new ArrayList<>();
        list.add("dsadsads");
        list.add("wsdjj");
        list.add("sdskk");
        list.add("a");

        //stream自然排序
         list.stream().sorted().forEach(System.out::println);
        System.out.println("----");
        //按字符串长度排序 长度一样按照自然排序                                                                                                                                                                                                                                                                                                                                                   
        list.stream().sorted((s1,s2)->{
            int num=s1.length()-s2.length();
            int num2=num==0?s1.compareTo(s2):num;
            return num2;
         }).forEach(System.out::println);

结果:

 

  •  Map流终止操作forEach和count
forEach(Consumer<? super T> action)

对此流的每个元素执行操作。

count()

返回此流中的元素数。

        ArrayList<String>list=new ArrayList<>();
        list.add("10");
        list.add("20");
        list.add("30");
        //过滤并统计元素总数
        long count = list.stream().filter(s -> s.equals("10")).count();
        list.stream().filter(s -> s.equals("10")).forEach(System.out::println);
        System.out.println(count);

 结果:

  •  Map&&mapToInt
map(Function<? super T,? extends R> mapper)

返回由给定函数应用于此流的元素的结果组成的流。

mapToInt(ToIntFunction<? super T> mapper)

返回一个 IntStream ,其中包含将给定函数应用于此流的元素的结果。

        ArrayList<String>list=new ArrayList<>();
        list.add("10");
        list.add("20");
        list.add("30");
        //list集合里的字符串转为Integer
        list.stream().map(Integer::parseInt).forEach(System.out::println);
        System.out.println("----");
       //mapToInt也有此一样的功能
        list.stream().mapToInt(Integer::parseInt).forEach(System.out::println);
        System.out.println("-----");
        //统计元素此流的元素结果
        int sum = list.stream().mapToInt(Integer::parseInt).sum();
        System.out.println(sum);

结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: StreamJava 8引入的一个新特性,它提供了一种更简洁、更高效的处理集合数据的方式。通过使用Stream,我们可以对集合进行各种操作,如过滤、映射、排序等,以及进行聚合操作,如求和、计数等。Stream的使用可以大大简化代码,并提高代码的可读性和可维护性。\[1\] 在面试中,常见Stream相关的问题包括: 1. 什么是Stream? 2. Stream的作用是什么? 3. Stream的使用场景有哪些? 4. Stream常见操作有哪些? 5. Stream的原理是什么? 对于这些问题,我们可以按照以下模式进行回答: 1. 概念:StreamJava 8引入的一个新特性,用于处理集合数据的工具。 2. 作用:Stream可以简化集合数据的处理,提高代码的可读性和可维护性。 3. 使用场景:Stream适用于对集合进行各种操作,如过滤、映射、排序等,以及进行聚合操作,如求和、计数等。 4. 常见操作Stream提供了丰富的操作方法,如filter、map、sorted等,可以根据需求进行链式调用。 5. 原理:Stream的原理是基于函数式编程的思想,通过将操作封装成函数,实现对集合数据的处理。 通过按照这个模式回答问题,我们可以清晰地介绍Stream的概念、作用、使用场景、常见操作和原理,展示出我们对Stream的理解和掌握。\[2\]同时,我们也可以结合具体的代码示例来说明Stream的用法,如使用Stream接口的concat方法将两个合并成一个。\[3\]这样的回答既能满足面试官的要求,又能展示我们对Stream的熟悉程度。 #### 引用[.reference_title] - *1* *2* [高薪程序员&面试题精讲系列26之介绍一下Java8中的Stream](https://blog.csdn.net/syc000666/article/details/121602058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [java面试题:Stream和方法引用](https://blog.csdn.net/m0_47379359/article/details/106526551)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值