toMap

常用方式

  1. public Map<Long, String> getIdNameMap(List<Account> accounts) {
  2. return accounts.stream().collect(Collectors.toMap(Account::getId, Account::getUsername));
  3. }

收集成实体本身map

  1. public Map<Long, Account> getIdAccountMap(List<Account> accounts) {
  2. return accounts.stream().collect(Collectors.toMap(Account::getId, account -> account));
  3. }
  4. //account -> account是一个返回本身的lambda表达式,其实还可以使用Function接口中的一个默认方法代替,使整个方法更简洁优雅:
  5. public Map<Long, Account> getIdAccountMap(List<Account> accounts) {
  6. return accounts.stream().collect(Collectors.toMap(Account::getId, Function.identity()));
  7. }

重复key

  1. public Map<String, Account> getNameAccountMap(List<Account> accounts) {
  2. return accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity()));
  3. }
  4. //这个方法可能报错(java.lang.IllegalStateException: Duplicate key),因为name是有可能重复的。toMap有个重载方法,可以传入一个合并的函数来解决key冲突问题:
  5. public Map<String, Account> getNameAccountMap(List<Account> accounts) {
  6. return accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity(), (key1, key2) -> key2));
  7. }
  8. //这里只是简单的使用后者覆盖前者来解决key重复问题。

指定具体收集的map

  1. public Map<String, Account> getNameAccountMap(List<Account> accounts) {
  2. return accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity(), (key1, key2) -> key2, LinkedHashMap::new));
  3. }

groupingBy

普通分组

  1. accounts.stream()
  2. .collect(Collectors.groupingBy(Account::getUsername));

分组,然后取最大的值

  1. Map<Integer, Optional<Users>> collect = users.stream()
  2. .collect(Collectors.groupingBy(Users::getAge, Collectors.maxBy(Comparator.comparing(Users::getId))));

分组,分组求和

  1. Map<Integer, Optional<Users>> collect = users.stream()
  2. .collect(Collectors.groupingBy(Users::getName, Collectors.summingInt(User::getAge)));

分组后,把原始对象进行转换为新的对象

  1. Map<Integer, List<String>> collect = users.stream()
  2. .collect(Collectors.groupingBy(Users::getAge, Collectors.mapping( item ->{
  3. //当然你这里也可以构建一个新的对象,进行返回
  4. return item.getName();
  5. }, Collectors.toList())));

终止

  1. // 获取所有薪资大于 15000 的员工人数
  2. long count = emps.stream() .filter((x)->x.getSalary() > 15000).count();
  1. // 获取所有薪资大于 15000 的员工人数
  2. long count = emps.stream().map(Employee::getSalary).max(Double::compare);
  1. // 获取所有薪资大于 15000 的员工人数
  2. long count = emps.stream().min((x,y)->Double.compare(x.getSalary(), y.getSalary()));

reduce

  1. //求集合元素只和
  2. Integer result = stream.reduce(0, Integer::sum);
  1. //求最大值
  2. stream.reduce(Integer::max)
  1. //求最小值
  2. stream.reduce(Integer::min)
  1. //求集合元素只和
  2. Integer result = stream.reduce(0, Integer::sum);
  1. //求逻辑求乘机
  2. int result2 = stream.filter(i -> i % 2 == 0).reduce(1, (i, j) -> i * j);

jdk8-collect的更多相关文章

  1. JAVA常用集合源码解析系列-ArrayList源码解析(基于JDK8)

    文章系作者原创,如有转载请注明出处,如有雷同,那就雷同吧~(who care!) 一.写在前面 这是源码分析计划的第一篇,博主准备把一些常用的集合源码过一遍,比如:ArrayList.HashMap及 ...

  2. JDK8新特性一览

    转载自:http://blog.csdn.net/qiubabin/article/details/70256683 官方新特性说明地址 Jdk8新特性.png 下面对几个常用的特性做下重点说明. 一 ...

  3. JDK8.0新特性

    连接转载地址:http://www.2cto.com/kf/201609/544044.html Eclipse: http://aiyiupload.oss-cn-beijing.aliyuncs. ...

  4. JDK8源码阅读之Collection及相关方法

    最近面试总会被问到JDK8中的一些新特性,所以闲下来抽时间看了一下8的源码,目前主要看的是数据结构部分,特此记录一下. 新增函数式接口,实现该接口的可以直接用lambda表达式. default和st ...

  5. jdk8中关于操作集合的一些新特性,遍历和排序操作

    jdk8增加了不少新的东西,在集合操作这块,就有如 lamda表达式,stream,sort,optional等新的类,主要涉及遍历和排序等方面,新特性提升了不少性能,我们开发就是要拥抱新事物,守着老 ...

  6. JDK8字符串拼接的正确姿势

    1. 对列表中的元素进行拼接 以前,对一个列表中的字符串进行拼接时,常见的代码如示例1所示: 代码示例1 List<String> ids = ImmutableList.of(" ...

  7. jdk8新特性-亮瞎眼的lambda表达式

    jdk8之前,尤其是在写GUI程序的事件监听的时候,各种的匿名内部类,大把大把拖沓的代码,程序毫无美感可言!既然Java中一切皆为对象,那么,就类似于某些动态语言一样,函数也可以当成是对象啊!代码块也 ...

  8. 试水jdk8 stream

    jdk8出来日子不短了,jdk11都出来了,不过用的最多的不过是1.5罢了. 今年终于鼓起勇气认真对待它,在18年记录下学习stream,画上一个圆. 先看个图 Java8中有两大最为重要的改变.第一 ...

  9. jdk8新特性-stream

    一.什么是流stream 1.可理解为高级版本的 Iterator 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的. 2.单向,不可往复 数据只能遍历一次,遍历过一次后即用尽了,就好比 ...

  10. jdk8中的StreamAPI

    1.实体类 package com.zy.model; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.D ...

随机推荐

  1. golang recover

    package main import "fmt" func divideByZero() { // Use this deferred function to handle er ...

  2. DataTable +chart控件

    //这是仿你的DataTable //-----开始--------- DataTable dataTable1 = new System.Data.DataTable(); dataTable1.C ...

  3. 全然用linux工作,放弃windows

    按: 虽然我们已经不习惯看长篇大论, 但我还是要说, 这是一篇值得你从头读到尾的长篇文章. 2005年9月22日,清华在读博士生王垠在水木社区BLOG上发表了<清华梦的粉碎--写给清华大学的退学 ...

  4. [D3] Add label text

    If we want to add text to a node or a image // Create container for the images const svgNodes = svg ...

  5. amazeui学习笔记--css(HTML元素4)--图片image

    amazeui学习笔记--css(HTML元素4)--图片image 一.总结 1.响应式图片:随着页面宽度而变化 .am-img-responsive class. <img src=&quo ...

  6. 11.3 Android显示系统框架_最简单的surface测试程序

    APP有一个surface(界面),其有多个buffer用来存放界面数据,这些buffer是向surfaceflinger申请的: 因此我们编写的surface测试程序步骤: (1)获得surface ...

  7. java.util.ConcurrentModificationException(如何避免ConcurrentModificationException)

    java.util.ConcurrentModificationException is a very common exception when working with java collecti ...

  8. 3、C++快速入门

    参考书籍: C++程序设计教程_第二版_钱能    //篇幅较少,适合快速学习 C++ Primer Plus  第六版  中文版   //篇幅较大,讲的非常详细 C++一般必须包含的头文件是#inc ...

  9. 【习题 5-8 UVA - 230】Borrowers

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用map+set写个模拟就好. 3个区域 书架.桌子.别人的手上. 其中前两个区域的书都能借出去. [代码] #include &l ...

  10. python打印即时输出的方法

    >>> import sys>>> sys.stdout.flush() 但是实验了,上面的报错,应该是不对的. 实验了,下面的报错,应该是不对的. 使用 prin ...