Java8Stream流

Stream流呢,以前我也有所了解,像一些面试题中也出现过,Java8的新特性,有一块就是这个Stream操作集合,而且在看一些项目中也使用的比较多。但总感觉自己学的一知半解,所以今天打算系统的过一下,再巩固巩固。

Stream是JDK8 API中的新成员,它允许以声明性方式处理集合。

1、把集合转换为流Stream
2、操作Stream流

Stream流在管道中经过 中间操作(intermediate operation)的处理,最后由 最终操作(terminal operation)得到前面处理的结果

方法名 方法作用 返回值类型 方法类型 filter 过滤 Stream 中间操作 map 映射(转换)接收一个函数作为参数,这个函数会被应用到每个元素上,并将其映射成为一个新的元素 Stream 中间操作 peek 窥探 Stream 中间操作 skip 跳过前几个 Stream 中间操作 limit 截取前几个 Stream 中间操作 distinct 去重操作(比较的是地址) Stream 中间操作 sorted 排序操作 Stream 中间操作

方法名 方法作用 返回值类型 方法类型 collect 收集处理结果 泛型 终止操作 count 统计个数 long 终止操作 forEach 逐一处理 void 终止操作 reduce 汇总操作 Optional<> 该对象有get方法可以获取返回值 终止操作

Stream的3个注意事项:

  • Stream中间操作方法返回的是新的流
  • Stream不调用终结方法,中间的操作不会执行
  • Stream只能调用一次终止操作。得到结果后,不能再次使用这个流。

点击查看代码

/**
     * &#x8FC7;&#x6EE4;&#x96C6;&#x5408;&#x4E2D;&#x4E0D;&#x7B26;&#x5408;&#x6761;&#x4EF6;&#x7684;&#x5143;&#x7D20;
     */
    @Test
    public void testfilter(){
        List<string> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl");
        List<string> aList = stringList.stream().filter(str -> str.contains("a")).collect(Collectors.toList());
        aList.forEach(System.err::println);
    }

    /**
     *&#x53BB;&#x91CD;
     */
    @Test
    public void testDistinct(){
        List<string> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl","jkl");
        List<string> distinctStr = stringList.stream().distinct().collect(Collectors.toList());
        distinctStr.forEach(System.out::println);
        //--------------------------------
        Product prod1 = new Product(1L, 1, new BigDecimal("15.5"), "&#x9762;&#x5305;", "&#x96F6;&#x98DF;");
        Product prod2 = new Product(2L, 2, new BigDecimal("20"), "&#x997C;&#x5E72;", "&#x96F6;&#x98DF;");
        Product prod3 = new Product(2L, 2, new BigDecimal("20"), "&#x997C;&#x5E72;", "&#x96F6;&#x98DF;");
        ArrayList<product> proList = Lists.newArrayList(prod1, prod2, prod3);
        List<product> distinctProList = proList.stream().distinct().collect(Collectors.toList());
        distinctProList.forEach(System.out::println);
    }

    /**
     * limit(n)&#x83B7;&#x53D6;&#x6D41;&#x4E2D;&#x7684;&#x524D;n&#x4E2A;&#x5143;&#x7D20;
     */
    @Test
    public void testLimit(){
        List<string> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl","jkl");
        List<string> limitStr = stringList.stream().limit(3).collect(Collectors.toList());
        System.out.println(limitStr);
    }

    /**
     * skip(n)
     */
    @Test
    public void testSkip(){
        List<string> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        List<string> skipStrList = stringList.stream().skip(2).collect(Collectors.toList());
        System.out.println(skipStrList);
    }

    /**
     * map() &#x63A5;&#x6536;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#xFF0C;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x4F1A;&#x88AB;&#x5E94;&#x7528;&#x5230;&#x6BCF;&#x4E2A;&#x5143;&#x7D20;&#x4E0A;&#xFF0C;&#x5E76;&#x5C06;&#x5176;&#x6620;&#x5C04;&#x6210;&#x4E3A;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x5143;&#x7D20;
     */
    @Test
    public void testMap(){
        List<string> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        List<string> mapStrList = stringList.stream().map(str -> str.concat("_map")).collect(Collectors.toList());
        System.out.println(mapStrList);
    }

    @Test
    public void testSorted(){
        List<string> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        List<string> sortedStrList = stringList.stream().sorted().collect(Collectors.toList());
        System.out.println(sortedStrList);
    }

    /**
     * collect():&#x5C06;&#x6D41;&#x8F6C;&#x6362;&#x4E3A;&#x5176;&#x4ED6;&#x5F62;&#x5F0F; list set map
     */
    @Test
    public void testCollect(){
        List<string> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        Set<string> collectSet = stringList.stream().collect(Collectors.toSet());
        System.out.println(collectSet);
    }

    /**
     * &#x5C06;&#x6D41;&#x4E2D;&#x5143;&#x7D20;&#x53CD;&#x590D;&#x7ED3;&#x5408;&#x8D77;&#x6765;&#x5F97;&#x5230;&#x4E00;&#x4E2A;&#x7ED3;&#x679C;
     */
    @Test
    public void testReduce(){
        List<string> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        Optional<string> reduce = stringList.stream().reduce((acc, item) -> {return acc + item;});
        if (reduce.isPresent()) System.out.println(reduce.get());
    }

    /**
     * &#x5C06;&#x6D41;&#x4E2D;&#x5143;&#x7D20;&#x53CD;&#x590D;&#x7ED3;&#x5408;&#x8D77;&#x6765;&#x5F97;&#x5230;&#x4E00;&#x4E2A;&#x7ED3;&#x679C;
     */
    @Test
    public void testCount(){
        List<string> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        long count = stringList.stream().count();
        System.out.println(count);
    }
</string></string></string></string></string></string></string></string></string></string></string></string></string></product></product></string></string></string></string>

Original: https://www.cnblogs.com/huoyl/p/Java8_Stream.html
Author: h*z
Title: Java8Stream流

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/598586/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL的undo日志—MVCC前置知识

    undo日志 前面学习了redo日志,redo日志保证的是崩溃时事务持久性。我们可以从redo日志恢复到系统崩溃以前。 undo日志就是为了保证事务回滚时事务所作所为都能回到事务执…

    数据库 2023年5月24日
    0100
  • IDEA 快捷键

    普通快捷键 分类 说明 快捷键 代码提示 代码提示或自动补全 Alt + / 代码提示 Ctrl + Alt + Space 提示方法参数类型 Ctrl + P 提示注释文档 Ct…

    数据库 2023年6月6日
    080
  • 数据结构堆

    引用 [](https://zh.wikipedia.org/wiki/%E5%A0%86%E7%A9%8D “维基百科堆结构”) [堆结构](https:…

    数据库 2023年6月9日
    089
  • Cookie和Session的关系和区别

    4.请简述Cookie和Session的区别 4.1什么是Cookie HTTP是无状态协议,他不能以状态来区分和管理请求和响应。也就是说服务器但从网络连接上无从知道客户身份。所以…

    数据库 2023年6月14日
    083
  • Nginx常见问题

    基于端口的虚拟机: 使用端口来区分,浏览器使用域名或ip地址:端口号 访问。 注意:~ 代表自己输入的英文字母。 16、location正则案例 1 #优先级1,精确匹配,根路径 …

    数据库 2023年6月14日
    0117
  • [转]failed to recv data in handshakeReceive2Callback

    一直用的好好地Shadowsocks今天突然发现打不开网页了,看了下日志发现被”failed to recv data in handshakeReceive2Call…

    数据库 2023年6月14日
    082
  • mysql查询优化

    1.count优化 a语句当行数超过11行的时候需要扫描的行数比b语句要多, b语句扫描了6行,此种情况下,b语句比a语句更有效率。 当没有where语句的时候直接select c…

    数据库 2023年5月24日
    082
  • 优化 JS 程序的一个小方法

    就像在学习之前先要识字,我想在介绍优化 JavaScript 代码之前,先介绍一下自己对编程语言的理解。故事要从一只叫做 Theseus 的机械鼠和其发明人克劳德-香农(Claud…

    数据库 2023年6月14日
    090
  • MyBatis(二)-CURD (ResultMap 一对一,一对多)

    1、insert 标签 1.1 获取SqlSessionFactory 对象的通用方法 方便后面分测试; //获取SqlSessionFactory 对象的通用方法 public …

    数据库 2023年6月16日
    076
  • AQS:Java 中悲观锁的底层实现机制

    介绍 AQS AQS(AbstractQueuedSynchronizer)是 Java 并发包中,实现各种同步组件的基础。比如 各种锁:ReentrantLock、ReadWri…

    数据库 2023年6月11日
    0113
  • Java线程状态(生命周期)–一篇入魂

    1.线程状态(生命周期) 一个线程在给定的时间点只能处于一种状态。 线程可以有如下6 种状态: New (新创建):未启动的线程; Runnable (可运行):可运行的线程,需要…

    数据库 2023年6月6日
    098
  • MySQL事务

    事务用于保证数据的一致性,由一组相关的dml语句组成,该组的dml语句要么全部成功后提交,要么全部失败。进行一个事物操作时,也可以防止其它用户修改表的数据。 举个例子:转账这个操作…

    数据库 2023年6月16日
    086
  • 编程书单

    前言 : 一开始我是不太关注技术书的, 但是直到在知乎看到了北邮人论坛转载的那个书单之后, 我才开始关注技术书尤其是技术书单. 现在我认为读技术书的效果会比看视频效果好, 但是最高…

    数据库 2023年6月11日
    073
  • Mysql学习

    显示字符集编码 mysql架构 逻辑架构 Client : 提供连接MySQL服务器功能的常用工具集 Server : MySQL实例,真正提供数据存储和数据处理功能的MySQL服…

    数据库 2023年6月16日
    064
  • 数据类型

    布尔类型:true和false;占一个位 public class Demo01 {    public static void main(String[] args) { Ori…

    数据库 2023年6月11日
    095
  • 面试题: 字符串转整型 终结者

    随着代码手感增强, 想为这个问题写个终结者系列. 缅怀下曾经的自己. 我们审视下这个问题, 整数字符串转成整数. 那么意味着有效字符仅有 “+-0123456789&#…

    数据库 2023年6月9日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球