list转map,set,使用stream进行转化


函数式编程:

场景:

  1. 从数据库中取出来的数据,经常是list集合类型,但是listmap这种场景虽然不常见,但是有时候也会遇到,最常见的还是转为set进行数据去重。

eg:

1 list转set

  1. List<Notification> notifications = notificationMapper.selectByExampleWithRowbounds(example,new RowBounds(offset, size));
  2. 数据获取到的是list集合,调用参数列表忽略,如果想使用,只需要知道返回的是list
  3. 一般返回的list都是有泛型约束的,所以如果转set集合代码如下:
  4. Set<Long> disUserIds = notifications.stream().map(notify -> notify.getNotifier()).collect(Collectors.toSet());
  5. 代码解析:
  6. 以下是stream下的map的源码:
  7. /**
  8. * Returns a stream consisting of the results of applying the given
  9. * function to the elements of this stream.
  10. *
  11. * <p>This is an <a href="package-summary.html#StreamOps">intermediate
  12. * operation</a>.
  13. *
  14. * @param <R> The element type of the new stream
  15. * @param mapper a <a href="package-summary.html#NonInterference">non-interfering</a>,
  16. * <a href="package-summary.html#Statelessness">stateless</a>
  17. * function to apply to each element
  18. * @return the new stream
  19. */
  20. <R> Stream<R> map(Function<? super T, ? extends R> mapper);
  21. 以上的是接口类,实现类的源码:
  22. @Override
  23. @SuppressWarnings("unchecked")
  24. public final <R> Stream<R> map(Function<? super P_OUT, ? extends R> mapper) {
  25. Objects.requireNonNull(mapper);
  26. return new StatelessOp<P_OUT, R>(this, StreamShape.REFERENCE,
  27. StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
  28. @Override
  29. Sink<P_OUT> opWrapSink(int flags, Sink<R> sink) {
  30. return new Sink.ChainedReference<P_OUT, R>(sink) {
  31. @Override
  32. public void accept(P_OUT u) {
  33. downstream.accept(mapper.apply(u));
  34. }
  35. };
  36. }
  37. };
  38. }
  39. 看都不懂系列。。。。
  40. 但是如果想使用的话:照葫芦画瓢,等用熟悉了后在来看源码。
  41. 简述代码功能:
  42. notifications.stream().map(notify -> notify.getNotifier()).collect(Collectors.toSet());
  43. 面向函数式编程: notify是参数,就相当于你自己写的方法, 什么public void getName(param 1,param2)中的paramx,默认的定义类型是泛型约束的类型,后面的.collect是转换为set类型。

2 list转map

  1. List<User> users = userMapper.selectByExample(userExample);
  2. 获取所有的用户
  3. //转化成map
  4. Map<Long, User> userMap = users.stream().collect(Collectors.toMap(u -> u.getId(), u -> u));
  5. Collectors.toMap参数是两个,keyvalue,所以返回的mapu.getId的类型Long,u的类型User

总结

  1. list转set:

    Set<Long> disUserIds = notifications.stream().map(notify -> notify.getNotifier()).collect(Collectors.toSet());

  2. list转map

    List users = userMapper.selectByExample(userExample);

    //转化成map

    Map<Long, User> userMap = users.stream().collect(Collectors.toMap(u -> u.getId(), u -> u));

list转map,set,使用stream进行转化的更多相关文章

  1. 怎么在java 8的map中使用stream

    怎么在java 8的map中使用stream 简介 Map是java中非常常用的一个集合类型,我们通常也需要去遍历Map去获取某些值,java 8引入了Stream的概念,那么我们怎么在Map中使用S ...

  2. Go语言高级特性总结——Struct、Map与JSON之间的转化

    Struct与Map之间互相转换 // Struct2Map convert struct to map func Struct2Map(st interface{}) map[string]inte ...

  3. java8中stream的map和flatmap的理解

    转自https://blog.csdn.net/wynjauu/article/details/78741093 假如我们有这样一个需求给定单词列表["Hello","W ...

  4. 利用stream对map集合进行过滤

    最近公司在大张旗鼓的进行代码审核,从中也发现自己写代码的不好习惯.一次无意的点到了公司封装的对map集合过滤的方法,发现了stream.于是研究了一下.并对原有的代码再次结合Optional进行重构下 ...

  5. Java8之Stream/Map

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

  6. Optional和Stream的map与flatMap

    Optional的map和flatMap Optional存在map和flatMap方法.map源码如下 public<U> Optional<U> map(Function& ...

  7. 使用Java8 Stream API对Map按键或值进行排序

    一.什么是Java 8 Stream 使用Java 8 Streams,我们可以按键和按值对映射进行排序.下面是它的工作原理: 将Map或List等集合类对象转换为Stream对象 使用Streams ...

  8. 恕我直言你可能真的不会java第4篇:Stream管道流Map操作

    一.回顾Stream管道流map的基础用法 最简单的需求:将集合中的每一个字符串,全部转换成大写! List<String> alpha = Arrays.asList("Mon ...

  9. 恕我直言你可能真的不会java第12篇-如何使用Stream API对Map类型元素排序

    在这篇文章中,您将学习如何使用Java对Map进行排序.前几日有位朋友面试遇到了这个问题,看似很简单的问题,但是如果不仔细研究一下也是很容易让人懵圈的面试题.所以我决定写这样一篇文章.在Java中,有 ...

随机推荐

  1. 线程池-进程池-io模型

    一.线程池与进程池 什么是池?简单的说就是一个容器,一个范围 在保证计算机硬件安全的情况下最大限度的充分利用计算机, 池其实是降低了程序的运行效率,但是保证了计算机硬件的安全,也是实现了一个并发的效果 ...

  2. Mysql数据库删除重复数据

    最近因为发现数据库中的表有脏数据,需要维护.这些脏数据就是重复数据,需要将其删除. 现假设有一张test表,主键字段为num,还有id,one,two三个字段.假设id规定只能有一条记录(即需要为id ...

  3. python脚本实现自动安装nginx

    本文python脚本实现自动化安装是源码安装.实现任意版本安装,默认版本是1.13.11,也可以更改默认版本,手动配置安装目录. 环境:Ubuntu16.04,python3以上版本,Ubuntu自带 ...

  4. 47)PHP,数据库多表连接

    https://www.w3cschool.cn/mysql/56ik1sqv.html

  5. 给本地web项目配置域名

    给本地的web项目配置一个域名 通常访问本地问项目时,使用localhost:port/projectname或者127.0.0.1:port/projectname来实现.我们可以通过配置tomca ...

  6. Ubuntu navicat 连接mysql:access denied for user 'root'@'localhost'

    真是醉了,Ubuntu装了navicat后,准备在桌面建立图标不成,结果直接打开后连接mysql都不行,真坑,奈何远程连接就成,这就尬了,今天终于解决了 问题 我也百度了好几个方案,奈何解决不了,最后 ...

  7. iOS多种刷新样式、音乐播放器、仿抖音视频、旅游App等源码

    iOS精选源码 企业级开源项目,模仿艺龙旅行App 3D立体相册,可以旋转的立方体 横竖屏切换工具,使用陀螺仪检测手机设备方向,锁屏状... Swift版Refresh(可以自定义多种样式)架构方面有 ...

  8. 学习python-20191208(1)-Python Flask高级编程开发鱼书_第03章_数据与flask路由

    视频01: 略...... ———————————————————————————————————————————————————————————— 视频02: 搜索需要外部数据源,也就是需要外部的A ...

  9. java和javascript日期详解

    ** java,js日期转换:** <Excerpt in index | 首页摘要> java的各种日期转换 <The rest of contents | 余下全文> 日期 ...

  10. Jeninks远程部署war包

    主体上看别人的脚本,然后和开发协商,做出符合自己的生产脚本................................ 脚本一: #!/bin/bash DATE=`date +%F-%H-%M` ...