前言

Java8新特性我们使用的应该比较多了,今天这里整理了个人使用最多的8种场景,希望对大家有所帮助。

Java Stream在集合中的运用案例

遍历

遍历也许是我们使用最多的功能了,在Java8之前我们遍历集合通常会采用for循环,迭代器,而在Java8中有了更加简介的方法:

 public static void main(String[] args) { List list = new ArrayList<>(); EmailModal email = new EmailModal(); email.setTitle("邮件名称"); list.add(email) //方式一:普通流 list.stream().forEach(emailModal -> { System.out.println(emailModal); System.out.println(emailModal.getTitle()); }); //方式二:并行流 list.parallelStream().forEach(emailModal -> { System.out.println(emailModal); System.out.println(emailModal.getTitle()); }); }

方式二中,相当于使用了多线程去并行遍历,系统会根据运行服务器的资源占用情况自动进行分配。也正是因为并行流采用了多线程的方式去遍历数据,所以我们需要注意以下两点(自己遇到的坑,可能还会有其他的坑我没有发现):

1.避免在并行流中使用线程不安全的对象,比如ArrayList

2.主线程中ThreadLocal存储的线程局部变量,不能再并行流中获取

过滤

我们经常需要将集合中一些数据进行过滤,比如过滤集合中负数,过滤一些权限相关数据,在Java8之前我们更多的是使用迭代器进行remove操作,在Java8中有了两种更加简介的方法,其一:利用Collection的removeIf方法;其二:利用Stream的filter方法。

 public static void main(String[] args) { List list = new ArrayList<>(); EmailModal email = new EmailModal(); email.setHtml(true); EmailModal email2 = new EmailModal(); email2.setHtml(false); list.add(email); list.add(email2); //removeIf方法过滤html为false的对象 list.removeIf(emailModal -> !emailModal.isHtml()); //filter方法过滤掉html为true的对象 list = list.stream().filter(emailModal -> !emailModal.isHtml()).collect(Collectors.toList()); list.stream().forEach(emailModal -> { System.out.println(emailModal); System.out.println(emailModal.isHtml()); }); }

对于上面两种方法,我们需要区分一下,首先removeIf会将表达式中返回true的元素过滤掉,filter方法会将表达式中返回true的元素保留下来,两者是相反的。其次使用stream的filter方法过滤数据,如果想对List生效,则必须使用collect方法让list接收。

去重

去重我们经常也会使用到,对集合了解程度的不同,我们会使用不同的方法,比如最简单的方法遍历数据,使用新的空集合接受数据,利用contains方法判断是否在新集合中add元素,其次就是使用HashSet,我们不判断直接将元素放到Set中,利用集合的特效去重。但是在Java8中有更加简洁的方案,方案一:我们可以利用distinct()方法实现,如果去重元素不是基本类型而是对象的话,需要重写hashcode和equals方法,否则会去重失败。方案二:利用filter配合HashSet去除重复元素,set新增元素如果重复会返回false,刚好配合filter过滤false的特效

 public static void main(String[] args) { List list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("1"); //方案一 list.stream().distinct().forEach(s -> { System.out.println(s); }); //方案二 list.stream().filter(distinctByKey(String::trim)).forEach(s -> { System.out.println(s); }); } private static  Predicate distinctByKey(Function super T, ?> keyExtractor) { Set seen = ConcurrentHashMap.newKeySet(); return t -> seen.add(keyExtractor.apply(t)); }

匹配

匹配数据也是我们常用的操作,比如我们需要在集合中找到属性ID为10的对象,将其取出,Java8之前我们通常会遍历集合,使用if判断,然后匹配到使用break跳出循环,但是在Java8中,我们可以使用anyMatch达到相同的效果。

 public static void main(String[] args) { List list = new ArrayList<>(); EmailModal email = new EmailModal(); email.setHtml(true); EmailModal email2 = new EmailModal(); email2.setHtml(true); list.add(email); list.add(email2); list.stream().anyMatch(emailModal -> { if (emailModal.isHtml()) { System.out.println(emailModal.isHtml()); //其他逻辑 return true; } return false; }); }

拼接

开发接口的时候,前端会存在传递使用某个符号(逗号)隔开的字符串,我们通常会将其转换为集合,作为批量查询的条件。或者我们需要将集合转换为逗号隔开的字符。

 String ids= "1,2,3,4,5,6"; //转集合 List listIds = Arrays.asList(ids.split(

java8 list 去重_Java8-Stream在集合中的8种应用案例相关推荐

  1. Map集合中的两种取出方式keySet和entrySet

    /*map集合中的两种取出方式:1.Set<k> keySet:将map集合中所有的键存入到Set集合,因为Set具备迭代器.所有可用迭代方式取出所有的键,再根据get方法,获取每一个键对 ...

  2. java8 list 去重_Java8中的Stream,一行代码,让集合操作飞起来

    简介 java8也出来好久了,接口默认方法,lambda表达式,函数式接口,Date API等特性还是有必要去了解一下.比如在项目中经常用到集合,遍历集合可以试下lambda表达式,经常还要对集合进行 ...

  3. stream 提取某字段_java8从list集合中取出某一属性的值的集合案例

    List orderNoList=list.stream().map(Order::getOrderNo).collect(Collectors.toList()); https://blog.csd ...

  4. list中抽出某一个字段的值_java8从list集合中取出某一属性的值的集合案例

    我就废话不多说了,大家还是直接看代码吧~ List list = new ArrayList(); Order o1 = new Order("1","MCS-2019- ...

  5. java11从list中取出某个属性_java8从list集合中取出某一属性的值的集合案例

    我就废话不多说了,大家还是直接看代码吧~ List list = new ArrayList(); Order o1 = new Order("1","MCS-2019- ...

  6. 集合框架(去除ArrayList集合中的重复字符串元素案例2)

    package cn.itcast_04; import java.util.ArrayList; import java.util.Iterator; /* * 需求:ArrayList去除集合中字 ...

  7. java集合的某项相加_java8实现list集合中按照某一个值相加求和,平均值等操作代码...

    集合: List user = new User(); user .stream().collect(Collectors.summingInt(User::getAge)) 参数类型: summar ...

  8. java8用一行代码将一个List集合中的部分内容复制到另一个List集合

    举例: 一张数据表user包括id,name,age,gender. 用List<User>装该数据表的全部数据,在这里我们假如直接获得这部分数据: List<User> us ...

  9. android 集合 内存泄漏,Android内存泄漏第二课--------(集合中对象没清理造成的内存泄漏 )...

    一.我们通常把一些对象的引用加入到了集合容器(比如ArrayList)中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大.如果这个集合是static的话,那情况就更严重 ...

最新文章

  1. mysql中index的作用,在mysql中使用INDEXES有什么好处?
  2. RabbitMQ headers Exchange
  3. REVERSE-PRACTICE-BUUCTF-7
  4. 在Spring框架中使用SQL存储过程
  5. 原生JS实现粘贴到剪贴板
  6. 关于JQuery的异步注册
  7. 智慧≥智能+应用 2016智能交通展的科达不等式
  8. 2022年计算机软件水平考试数据库系统工程师(中级)练习题及答案
  9. 智慧校园APP开发有哪些功能
  10. __imp__ZN11QSerialPortC1EP7QObject
  11. 科普:商标图样的要求有哪些?
  12. Android界面隐藏软键盘的探索(兼findViewById返回null解决办法)
  13. 快速部署阿里云WebIDE(DevStudio)并参与开源项目开发
  14. 软件工程导论复试——一、软件工程学概述
  15. 安装6.0之后,防止应用进入DOZE状态,导致无法后台请求服务器,或者其他请求。
  16. PCF应用管理平台介绍(PCF Apps Manager)
  17. 微信html5 下拉刷新,【报Bug】Iphone6s微信浏览器打开H5页面,出现下拉刷新bug
  18. InnoSetup制作补丁包替换文件操作
  19. 神经网络学习小记录52——Pytorch搭建孪生神经网络(Siamese network)比较图片相似性
  20. 基于FFmpeg的音视频播放器

热门文章

  1. 学生成绩查询java版_学生成绩查询系统,基于ssm的JAVA系统
  2. 闪电shader_【Shader案例】怎样做出自然的闪电
  3. SpringBoot 使用教程
  4. python里类的概念
  5. 类的 三大特性 封装,继承,多态 overload与override的区别
  6. Microsoft Hololens开发上手(4)
  7. 在SharePoint 2010中创建网站的权限级别
  8. 查看一个结构体成员的方法
  9. photoshop script
  10. 使用js实现换肤功能