遍历

// list 遍历,stream() 可省略
list.stream().forEach(e -> {
}); // map 遍历
map.forEach((k,v) -> {
});

过滤

// 保留 age > 18 的
userList.stream().filter(e -> e.getAge() > 18);
// 上面的操作其实是每个元素的年龄和 18 比较,如果大于18就返回 true,如果小于就返回 false,保留 true 的比较项
userList.stream().filter(e -> {
if(e.getAge() > 18){
return true;
} else {
return false;
}
}); // 移除 age <= 18 的(这个不是流的但是和流的过滤能做到一样的事儿,注意条件是相反的)
userList.removeIf( e -> e.getAge() <= 18);

映射

// 只要用户名
userList.stream().map( e -> e.getName()); // 转型
userList.stream().map( e -> {
Member member = new Member();
BeanUtils.copyProperties(e, member);
retuen member;
})

最值

// 数值列表(两种写法都是取最大值)
intList.stream().max(Integer::compare).get();
intList.stream().mapToInt(Integer::intValue).min().getAsInt(); // 对象列表(最大和最小年龄)
userList.stream().max(Comparator.companing(User::getAge)).get();
userList.stream().min(Comparator.companing(User::getAge)).get();

排序

// 用户列表根据年龄倒叙,相同年龄的根据分数顺序,mysql 的 order by age desc, score
userList.stream()
.sorted(Comparator
.comparing(User::getAge, Comparator.reverseOrder())
.thenComparing(User::getScore)
)
.collect(Collectors.toList());

分组

// 用性别分组
Map<String, List<Person>> sexGroup = personList.stream().collect(Collectors.groupingBy(e -> e.getSex())); // 先用性别分组,再用区域分组
Map<String, Map<String, List<Person>>> areaGroup = personList.stream().collect(Collectors.groupingBy(Person::getSex, Collectors.groupingBy(Person::getArea))); // 根据 店铺ID和商品ID 分组商品
Map<String, List<Item>> sexGroup = itemList.stream().collect(Collectors.groupingBy(e -> e.getShopId() + "-" + e.getItemId()));

list 转 map

效果和 分组 类似,只不过分组后 value 可能是多个,这种转型之后 value 只是一个,如果 value 是多个会报错

Collectors.toMap(param1, param2, param3)第一个参数指定 key,第二个参数指定 value,第三个参数是当key对应的 value 重复时的处理

// 用户列表转成 map(k:用户Id,v:用户)
Map<String, User> collect = userList.stream().collect(Collectors.toMap(e -> e.getId(), e -> e, (e1, e2) -> e1)); // 订单商品列表转成 map(k:商品Id,v:商品数量(如果商品id重复,数量就相加))
Map<String, Integer> collect = itemList.stream().collect(Collectors.toMap(e -> e.getItemId(), e -> e.getSize(), (e1, e2) -> e1+e2));

java8 stream 常用操作的更多相关文章

  1. Stream常用操作以及原理探索

    Stream常用操作以及原理 Stream是什么? Stream是一个高级迭代器,它不是数据结构,不能存储数据.它可以用来实现内部迭代,内部迭代相比平常的外部迭代,它可以实现并行求值(高效,外部迭代要 ...

  2. JAVA8 Stream集合操作:中间方法和完结方法

    StreamLambda为java8带了闭包,这一特性在集合操作中尤为重要:java8中支持对集合对象的stream进行函数式操作,此外,stream api也被集成进了collection api, ...

  3. Java8 Stream终端操作使用详解

    话不多说,自己挖的坑自己要填完,今天就给大家讲完Java8中Stream的终端操作使用详解.Stream流的终端操作主要有以下几种,我们来一一讲解. forEach() forEachOrdered( ...

  4. Java8 Stream中间操作使用详解

    前面两篇简单的介绍了Stream以及如何创建Stream,本篇就给大家说说stream有哪些用途,以及具体怎样使用. 再次介绍Stream Stream 使用一种类似用于SQL 语句从数据库查询数据的 ...

  5. java8 stream流操作的flatMap(流的扁平化)

    https://mp.weixin.qq.com/s/7Fqb6tAucrl8UmyiY78AXg https://blog.csdn.net/Mark_Chao/article/details/80 ...

  6. Java8 Stream流API常用操作

    Java版本现在已经发布到JDK13了,目前公司还是用的JDK8,还是有必要了解一些JDK8的新特性的,例如优雅判空的Optional类,操作集合的Stream流,函数式编程等等;这里就按操作例举一些 ...

  7. 【JDK8】Java8 Stream流API常用操作

    Java版本现在已经发布到JDK13了,目前公司还是用的JDK8,还是有必要了解一些JDK8的新特性的,例如优雅判空的Optional类,操作集合的Stream流,函数式编程等等;这里就按操作例举一些 ...

  8. Java8获取当前时间、新的时间日期类如Java8的LocalDate与Date相互转换、ZonedDateTime等常用操作包含多个使用示例、Java8时区ZoneId的使用方法、Java8时间字符串解析成类

     下面将依次介绍 Date转Java8时间类操作 ,Java8时间类LocalDate常用操作(如获得当前日期,两个日期相差多少天,下个星期的日期,下个月第一天等) 解析不同时间字符串成对应的Java ...

  9. Stream流的基本介绍以及在工作中的常用操作(去重、排序以及数学运算等)

    平时工作中,我在处理集合的时候,总是会用到各种流操作,但是往往在处理一些较为复杂的集合时,还是会出现无法灵活运用api的场景,这篇文章的目的,主要是为介绍一些工作中使用流时的常用操作,例如去重.排序和 ...

  10. Java8 Stream 的一些操作和介绍

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11858186.html Java8 Stream 是一个新的东西, 就是能够将常见的数据结构转 ...

随机推荐

  1. Linux操作系统导学专栏(一)——专栏要讲些什么?

    ​ 该专栏是为Linux内核开发编程做铺垫,如果你对操作系统很熟悉,想了解一些Linux内核发开的知识,请直接跳转至<Linux内核编程专栏>,如果你对Linux内核编程也很熟悉,想了解L ...

  2. Pytest插件pytest-assume多重断言

    Pytest插件pytest-assume多重断言 背景 import pytest def test_assume1(): assert 1 == 2 print('hello') assert 2 ...

  3. 使用 LoRA 进行 Stable Diffusion 的高效参数微调

    LoRA: Low-Rank Adaptation of Large Language Models 是微软研究员引入的一项新技术,主要用于处理大模型微调的问题.目前超过数十亿以上参数的具有强能力的大 ...

  4. spring in action day07 RabbitMq

    一:安装RabbitMq 记录下本人在win10环境下安装RabbitMQ的步骤,以作备忘. 第一步:下载并安装erlang erlang和rabbitmq对应版本说明:https://www.rab ...

  5. mysql18-Show Profile和全局日志

    1.是什么 分析SQL执行带来的开销是优化SQL的重要手段.在MySQL数据库中,可以通过配置profiling参数来启用SQL剖析.该参数开启后,后续执行的SQL语句都将记录其资源开销,诸如IO,上 ...

  6. 数据存储单位、编程语言的发展史、python解释器版本、解释器的下载与安装、多版本共存、第一个python程序、pycharm下载

    目录 一.数据存储单位 (1).简介 (2).换算单位 二.编程语言的发展史 (1).机器语言 (2).汇编语言 (3).高级语言 三.编程语言的分类 (1).编译型语言 (2).解释型语言 四.py ...

  7. 储存环束流3D参数测量系统程序1.0版使用说明

    经过几个月的改进,4通道同时采是从3月份开始的,主要通过这两个月的在线测试和不断改进,现在程序弄得还算好用了,可以拿出来分享了. 我这点小伎俩拿出来可千万别觉得我在卖弄,主要是觉得可以为兄弟单位愿意搞 ...

  8. 代码随想录算法训练营day14 | leetcode 层序遍历 226.翻转二叉树 101.对称二叉树 2

    层序遍历 /** * 二叉树的层序遍历 */ class QueueTraverse { /** * 存放一层一层的数据 */ public List<List<Integer>&g ...

  9. ABP微服务系列学习-对接前端界面

    前面我们把后端的微服务架子基本搭建完成并成功启动了,现在我们可以对接前端界面了.这里我们直接用ABP模板里面的Angular的前端界面. 创建应用程序模板 使用ABPCli创建一个应用程序模板,前端选 ...

  10. 关于Intent Uri页面跳转

    android browser支持支持Intent Scheme URL语法的可以在wrap页面加载或点击时,通过特定的intent uri链接可以打开对应app页面,例如 <a href=&q ...