collection.stream()用法详解 刺骨的言语ヽ痛彻心扉 2021-10-23 12:28 340阅读 0赞 stream()方法和collect()方法都是java8的新特性 List<String> widgetIds = widgets.stream().map(Widget::getWidgetId).collect(Collectors.toList()); 解释下一这行代码: widgets:一个实体类的集合,类型为List Widget:实体类 getWidgetId:实体类中的get方法,为获取Widget的id 本来想要获得wiget的id集合,按照我的思路肯定是遍历widges,依次取得widgetIds,但是此行代码更加简洁,高效 stream()优点 无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。 为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。 惰式执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。 可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。 stream().map()方法的使用示例: List<String> list= Arrays.asList("a", "b", "c", "d"); List<String> collect =list.stream().map(String::toUpperCase).collect(Collectors.toList()); System.out.println(collect); //[A, B, C, D] List<Integer> num = Arrays.asList(1,2,3,4,5); List<Integer> collect1 = num.stream().map(n -> n * 2).collect(Collectors.toList()); System.out.println(collect1); //[2, 4, 6, 8, 10] # Lambda 之 Collection Stream # Collection.stream() 测试实体类 class Demo { private Long id; private String name; } // 实例化并组成一个List List<Demo> demos = Lists.newArrayList(new Demo(1L, "SF"), new Demo(2L, "AXE")); ##### 1.map + collect用法 ##### 场景1:获取List列表的所有id No Lambda public static List<Long> getIds(List<Demo> demos){ List<Long> ids = Lists.newArrayList(); for (Demo d : demos) { ids.add(d.getId()); } return ids; } Lambda’s show List<Long> ids = demos.stream().map(Demo::getId).collect(toList()); 最后toList() 可以有更多的实现,比如 Set<Long> ids = demos.stream().map(Demo::getId).collect(toSet()); 场景2:list变成map 有时候我们把list变成map,将多次List的O(n)遍历变成Map的O(1)查询,拿空间换时间 No lambda public static Map<Long, Demo> getIds(List<Demo> demos){ Map<Long, Demo> map = Maps.newHashMap; for (Demo d : demos) { map.put(d.getId, d); } return map; } Lambda‘s show Map<Long, Demo> map = demos.stream().collect(toMap(Demo::getId, o -> o)); ##### 2.filter ##### 场景1:从List中找到name="SF"的Demo实例 No lambda public static Demo getSpecifyDemo(String name, List<Demo> demos){ Demo target = null; for (Demo demo : demos) { if (name.equals(demo.getName())) { target = demo; } } return target; } Lambda’s show–粗犷的老汉推车 String targetName = "SF"; Demo target = demos.stream().filter(d -> targetName.equals(d.getName())).findFirst().orElse(null); 这种写法非常简单,但是调用链太长,一个lambda能够绕地球好几圈,最好写成以下格式,防止步子迈得太大。 Lambda’s show–优雅传教士 Demo target = demos.stream() .filter(d -> targetName.equals.equals(d.getName())) .findFirst() .orElse(null); find()的结果是Optional,Optional号称NPE终结者,于是对于find()的结果你可以随意使用终结者携带的任何武器,例如orElse(),ifPresent(),isPresent()…每个用起来都是那种哒哒哒冒蓝火的,更多姿势详见Optional的裸体源码。 ##### 3.match ##### match()是filter()的缩写版本,返回结果只有boolean类型,返回是否匹配。 场景1:当前list中某个元素是否符合某个条件 这个例子,给出另一个用法Demo::getId No lambda List<String> condition = new ArrayList<>(); condition.add("SF"); public static boolean isExist(List<String> condition, List<Demo> demos){ boolean flag = false; for (Demo demo : demos) { if (condition.contains(demo.getName())) { flag = true; break; } } return flag; } Lambda’s show 使用filter boolean flag = demos.stream() .map(Demo::getName) .filter(condition::contains) .findAny() .isPresent(); Lambda’s show 直接使用match boolean flag = demos.stream() .map(Demo::getName) .anyMatch(condition::contains);
相关 JNDI用法详解 > JNDI全称(Java Naming and Directory Interface),是java命名和目录接口。它是一个应用程序设计的API,为开发人员提供了查找和访问各 谁践踏了优雅/ 2022年12月23日 12:26/ 0 赞/ 237 阅读
相关 const用法详解 一、定义常量 使用\define的不安全性 include <iostream> using namespqce std; int main( 怼烎@/ 2022年12月19日 11:43/ 0 赞/ 164 阅读
相关 defaultdict用法详解 defaultdict用法详解 defaultdict与dict区别 defaultdict使用方法 defaultdict与dict区别 ゞ 浴缸里的玫瑰/ 2022年10月08日 05:48/ 0 赞/ 193 阅读
相关 JavaScript用法详解 简介 JavaScript 秘密花园是一个不断更新,主要关心 JavaScript 一些古怪用法的文档。 对于如何避免常见的错误,难以发现的问题,以及性能问题和不好的实践 待我称王封你为后i/ 2022年06月05日 10:11/ 0 赞/ 153 阅读
相关 @ModelAttribute用法详解 转载于:[https://blog.csdn.net/harry\_zh\_wang/article/details/57329613][https_blog.csdn.net 傷城~/ 2022年05月27日 00:39/ 0 赞/ 269 阅读
相关 FormData用法详解 转载自:[https://blog.csdn.net/zqian1994/article/details/79635413][https_blog.csdn.net_zqian - 日理万妓/ 2022年05月08日 08:46/ 0 赞/ 357 阅读
相关 FormData用法详解 FormData 对象: ![formdata][] 一.创建一个formData对象实例的方式 1、创建一个空对象 var formData = new 爱被打了一巴掌/ 2022年03月22日 03:15/ 0 赞/ 313 阅读
相关 ProcessBuilder 用法详解 原文:https://blog.csdn.net/zhoujing\_0424/article/details/79917368 1. 简介 ProcessBuilde 超、凢脫俗/ 2022年01月06日 14:43/ 0 赞/ 640 阅读
相关 @RequestMapping用法详解 一、@RequestMapping 简介 在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于S 比眉伴天荒/ 2021年10月01日 00:18/ 0 赞/ 403 阅读
还没有评论,来说两句吧...