Java8中stream对集合操作做了简化,用stream操作集合能极大程度简化代码。Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后就用尽了。

一、流的转换

  Java中的Stream的所有操作都是针对流的,所以,使用Stream必须要得到Stream对象。

  • 初始化stream流

    Stream stream = Stream.of("a", "b", "c");
  • 数组转换为stream流

    String [] strArray = new String[] {"a", "b", "c"};
    stream = Stream.of(strArray);
    或者
    stream = Arrays.stream(strArray);
  • 集合对象转换为一个stream流

    List<String> list = Arrays.asList(strArray);
    stream = list.stream();

二、流的基本操作

  •   遍历操作(map):使用map操作可以遍历集合中的每个对象,并对其进行操作,map之后,用.collect(Collectors.toList())会得到操作后的集合。

    //遍历转换为大写
    List<String> output = wordList.stream(). map(String::toUpperCase).collect(Collectors.toList());
    //平方数
    List<Integer> nums = Arrays.asList(1, 2, 3, 4);
    List<Integer> squareNums = nums.stream().map(n -> n * n).collect(Collectors.toList());
  • 过滤操作(filter):使用filter可以对象Stream中进行过滤,通过测试的元素将会留下来生成一个新的Stream。

    //去点空值
    List<String> filterLists = new ArrayList<>();
    filterLists.add("");
    filterLists.add("a");
    filterLists.add("b");
    List afterFilterLists = filterLists.stream().filter(s -> !s.isEmpty())
    .collect(Collectors.toList()); //递归判断得到子数据
    private List<MenuDto> convertTree(List<MenuDto> menus,Long parentId) {
    List<MenuDto> targetList = new ArrayList<>();
    List<MenuDto> menuList = menus.stream().filter(item -> item.getParentId().equals(parentId)).collect(Collectors.toList());
    menuList.forEach(item ->{
    targetList.add(new MenuDto(item.getId(),
    item.getUrl(),
    item.getPath(),
    item.getComponent(),
    item.getName(),
    item.getIconCls(),
    item.getParentId(),
    item.getEnabled(),
    item.getSort(),
    item.getRoles(),
    convertTree(menus,item.getId()),
    item.getMeta()));
    });
    //根据权重逆序
    List<MenuDto> targetList1=targetList.stream().sorted(Comparator.comparing(MenuDto::getSort).reversed()).collect(Collectors.toList());
    return targetList1;
    }
  • 循环操作(forEach):如果只是想对流中的每个对象进行一些自定义的操作,可以使用forEach。
    List<String> forEachLists = new ArrayList<>();
    forEachLists.add("a");
    forEachLists.add("b");
    forEachLists.add("c"); forEachLists.stream().forEach(s-> System.out.println(s));
  • 返回特定的结果集合(limit/skip):limit 返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素。
    //skip与limit是有顺序关系
    List<String> forEachLists = new ArrayList<>();
    forEachLists.add("a");
    forEachLists.add("b");
    forEachLists.add("c");
    forEachLists.add("d");
    forEachLists.add("e");
    forEachLists.add("f");
    List<String> limitLists = forEachLists.stream().skip(2).limit(3).collect(Collectors.toList());
  • 排序(sort/min/max/distinct):sort可以对集合中的所有元素进行排序。max,min可以寻找出流中最大或者最小的元素,而distinct可以寻找出不重复的元素。
    //对一个集合进行排序
    List<Integer> sortLists = new ArrayList<>();
    sortLists.add(1);
    sortLists.add(4);
    sortLists.add(6);
    sortLists.add(3);
    sortLists.add(2);
    List<Integer> afterSortLists = sortLists.stream().sorted((In1,In2)-> In1-In2).collect(Collectors.toList()); //自然序列
    List<Student> studentList1=studentList.stream().sorted().collect(Collectors.toList());
    //逆序
    List<Student> studentList2=studentList.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
    //根据年龄自然顺序
    List<Student> studentList3=studentList.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
    //根据年龄逆序
    List<Student> studentList4=studentList.stream().sorted(Comparator.comparing(Student::getAge).reversed()).collect(Collectors.toList());
    //打印
    studentList4.forEach(student -> System.out.println("id is "+student.getId()+" ;name is "+student.getName()+";age is "+student.getAge()));

    //得到其中长度最大的元素:
    List<String> maxLists = new ArrayList<>();
    maxLists.add("a");
    maxLists.add("b");
    maxLists.add("c");
    maxLists.add("d");
    maxLists.add("e");
    maxLists.add("f");
    maxLists.add("hahaha");
    int maxLength = maxLists.stream().mapToInt(s->s.length()).max().getAsInt();
    System.out.println("字符串长度最长的长度为"+maxLength);
    //对一个集合进行查重
    List<String> distinctList = new ArrayList<>();
    distinctList.add("a");
    distinctList.add("a");
    distinctList.add("c");
    distinctList.add("d");
    List<String> afterDistinctList = distinctList.stream().distinct().collect(Collectors.toList());
  • 匹配(Match方法):有的时候,我们只需要判断集合中是否全部满足条件,或者判断集合中是否有满足条件的元素,这时候就可以使用match方法:

    allMatch:Stream 中全部元素符合传入的 predicate,返回 true
    anyMatch:Stream 中只要有一个元素符合传入的 predicate,返回 true

    noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true

    //判断集合中没有有为‘c’的元素
    List<String> matchList = new ArrayList<>();
    matchList.add("a");
    matchList.add("a");
    matchList.add("c");
    matchList.add("d");
    boolean isExits = matchList.stream().anyMatch(s -> s.equals("c")); //判断集合中是否全不为空
    List<String> matchList = new ArrayList<>();
    matchList.add("a");
    matchList.add("");
    matchList.add("a");
    matchList.add("c");
    matchList.add("d");
    boolean isNotEmpty = matchList.stream().noneMatch(s -> s.isEmpty());

java8的stream功能及常用方法的更多相关文章

  1. Java8的Stream API使用

    前言 这次想介绍一下Java Stream的API使用,最近在做一个新的项目,然后终于可以从老项目的祖传代码坑里跳出来了.项目用公司自己的框架搭建完成后,我就想着把JDK版本也升级一下吧(之前的项目, ...

  2. Java8的Stream方法findAny空指针异常(NullPointerException)实例对比

    实战介绍 学习完Java8的Stream方法,可能你正准备大展身手,却发现遇到不少问题,本篇文章为大家带来一个findAny方法抛出java.lang.NullPointerException的场景. ...

  3. java8中stream常用方法详解

    map: 用作类型转换 如把集合里面的字符串转为大写,或者一个对象的集合取几个字段转为新的对象集合filter: 过滤 符合条件的集合元素保存下来,不符合条件的去掉flatMap:合并集合,比如Lis ...

  4. java8之stream

    lambda表达式是stream的基础,初学者建议先学习lambda表达式,http://www.cnblogs.com/andywithu/p/7357069.html 1.初识stream 先来一 ...

  5. Java8之Stream/Map

    本篇用代码示例结合JDk源码讲了Java8引入的工具接口Stream以及新Map接口提供的常用默认方法.    参考:http://winterbe.com/posts/2014/03/16/java ...

  6. JAVA8之 Stream 流(四)

    如果说前面几章是函数式编程的方法论,那么 Stream 流就应该是 JAVA8 为我们提供的最佳实践. Stream 流的定义 Stream 是支持串行和并行操作的一系列元素.流操作会被组合到流管道中 ...

  7. java8之Stream流处理

    简介 Stream 流处理,首先要澄清的是 java8 中的 Stream 与 I/O 流 InputStream 和 OutputStream 是完全不同的概念. Stream 机制是针对集合迭代器 ...

  8. Java8 Lambda/Stream使用说明

    一.Stream流1. 流的基本概念 1.1 什么是流?流是Java8引入的全新概念,它用来处理集合中的数据,暂且可以把它理解为一种高级集合.众所周知,集合操作非常麻烦,若要对集合进行筛选.投影,需要 ...

  9. Java8 之stream

    总概述:Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggregate operation),或者大批量数据操 ...

随机推荐

  1. 解决Django本地接口不能跨域访问的问题

    1.安装django-cors-headers模块: pip install django-cors-headers 2.插入Django的APP配置中: # 修改settings.py中的INSTA ...

  2. node运行js获得输出的三种方式

    一.通过console.log输出(我最喜欢的) 1.js脚本 1.js var arguments = process.argv.splice(2); //获得入参 var a= arguments ...

  3. Java网关服务-AIO(三)

    Java网关服务-AIO(三) 概述 前两节中,我们已经获取了body的总长度,剩下的就是读出body,处理请求 ChannelServerHandler ChannelServerHandler即从 ...

  4. linux安装日志切割程序

    ====linux安装日志切割程序==== 安装 gcc(1) yum insatll gcc (2)# cd cronolog-1.6.2 4.运行安装 # ./configure# make# m ...

  5. 权值线段树&&可持久化线段树&&主席树

    权值线段树 顾名思义,就是以权值为下标建立的线段树. 现在让我们来考虑考虑上面那句话的产生的三个小问题: 1. 如果说权值作为下标了,那这颗线段树里存什么呢? ----- 这颗线段树中, 记录每个值出 ...

  6. Centos7安 装python3+Selenium+chrome+chromedriver

    Centos7安装python3+Selenium+chrome+chromedriver详细python2和python3共存,Selenium错误的处理更新Centos源 wget -O /etc ...

  7. python3爬虫应用--爬取网易云音乐(两种办法)

    一.需求 好久没有碰爬虫了,竟不知道从何入手.偶然看到一篇知乎的评论(https://www.zhihu.com/question/20799742/answer/99491808),一时兴起就也照葫 ...

  8. 揭秘仿比心app源码的开发背后,功能是如何实现的

    约单陪玩系统作为最近兴起的开发热点,引起了竞相开发,其中比心源码可以说是行业内运营级别的APP中功能比较齐全的,那么仿比心app源码的功能是如何实现的呢,接下来就带大家简单分析一下. 仿比心app源码 ...

  9. 对hadoop之RPC的理解

    因为公司hadoop集群出现了一些瓶颈,在机器不增加的情况下需要进行优化,不管是存储还是处理性能,更合理的利用现有集群的资源,所以来学习了一波hadoop的rpc相关的知识和hdfs方面的知识,以及y ...

  10. SpringBoot的外部化配置最全解析!

    目录 SpringBoot中的配置解析[Externalized Configuration] 本篇要点 一.SpringBoot官方文档对于外部化配置的介绍及作用顺序 二.各种外部化配置举例 1.随 ...