package test9;

import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream; public class CollectorsTest {
public static void main(String[] args) {
Map<String, Person> map = Stream
.of(Person.valueOf("小明", '男', 18), Person.valueOf("小丽", '女', 16), Person.valueOf("小王", '男', 19))
.collect(Collectors.toMap(Person::getName, Function.identity()));
System.out.println("map:" + map); Map<String, Person> map2 = Stream
.of(Person.valueOf("小明", '男', 18), Person.valueOf("小丽", '女', 16), Person.valueOf("小明", '男', 19))
.collect(Collectors.toMap(Person::getName, Function.identity(), (x, y) -> y));
System.out.println("如果有2个key重复了就用新的,‘y’,想用旧的代替就用'x',自己选择,map2:" + map2); /*
* 需求:要求将已有的国家名为key, 人名为value(当然也可以是对象)集合。
*/
Map<String, Set<String>> map3 = Stream
.of(Person.valueOf("China", "小明"), Person.valueOf("China", "小丽"), Person.valueOf("us", "Jack"),
Person.valueOf("us", "Alice"))
.collect(Collectors.toMap(Person::getCountry, p -> Collections.singleton(p.getName()), (x, y) -> {
Set<String> set = new HashSet<>(x);
set.addAll(y);
return set;
}));
System.out.println("map3:" + map3); // 将所有元素检查key不重复且最终包装成一个TreeMap对象
Map<String, String> map4 = Stream.of(Person.valueOf("China", "小明"), Person.valueOf("Chinsa", "小丽"), Person.valueOf("us", "Jack"),
Person.valueOf("uss", "Alice"))
.collect(Collectors.toMap(
Person::getCountry,
Person::getName, (x, y) ->
{
throw new IllegalStateException();
},TreeMap::new));
System.out.println(map4); }
} class Person {
private String country; private String name; private Character sex; private Integer age; public String getCountry() {
return country;
} public void setCountry(String country) {
this.country = country;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Character getSex() {
return sex;
} public void setSex(Character sex) {
this.sex = sex;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "name:" + name + "sex:" + sex + "age" + age;
} public static Person valueOf(String country, String name) {
Person person = new Person();
person.country = country;
person.name = name;
return person;
} public static Person valueOf(String name, Character sex, Integer age) {
Person person = new Person();
person.name = name;
person.sex = sex;
person.age = age;
return person;
}
}

打印结果:

map:{小明=name:小明sex:男age18, 小丽=name:小丽sex:女age16, 小王=name:小王sex:男age19}

如果有2个key重复了就用新的,‘y’,想用旧的代替就用'x',自己选择,map2:{小明=name:小明sex:男age19, 小丽=name:小丽sex:女age16}

map3:{China=[小明, 小丽], us=[Alice, Jack]}

{China=小明, Chinsa=小丽, us=Jack, uss=Alice}

java中的stream的Map收集器操作的更多相关文章

  1. java中的Stream流

    java中的Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定"流"就一定是"IO流"呢?在Java 8中,得益于Lambda所带 ...

  2. Java中集合List,Map和Set的区别

    Java中集合List,Map和Set的区别 1.List和Set的父接口是Collection,而Map不是 2.List中的元素是有序的,可以重复的 3.Map是Key-Value映射关系,且Ke ...

  3. JAVA 中的 Collection 和 Map 以及相关派生类的概念

    JAVA中Collection接口和Map接口的主要实现类   Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的 ...

  4. Java中的Set,List,Map的区别

    1. 对JAVA的集合的理解是想对于数组 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型) JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 ja ...

  5. Java中集合List,Map和Set的差别

    Java中集合List,Map和Set的差别 1.List和Set的父接口是Collection.而Map不是 2.List中的元素是有序的,能够反复的 3.Map是Key-Value映射关系,且Ke ...

  6. 【Java8新特性】面试官:谈谈Java8中的Stream API有哪些终止操作?

    写在前面 如果你出去面试,面试官问了你关于Java8 Stream API的一些问题,比如:Java8中创建Stream流有哪几种方式?(可以参见:<[Java8新特性]面试官问我:Java8中 ...

  7. Java中list如何利用遍历进行删除操作

    转: Java中list如何利用遍历进行删除操作 2018年03月31日 10:23:41 Little White_007 阅读数:3874   Java三种遍历如何进行list的便利删除: 1.f ...

  8. java中对对象进行判空的操作--简洁编码

    java中对对象进行判空的操作 首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.ut ...

  9. 深入理解Java虚拟机读书笔记2----垃圾收集器与内存分配策略

    二 垃圾收集器与内存分配策略 1 JVM中哪些内存需要回收?     JVM垃圾回收主要关注的是Java堆和方法区这两个区域:而程序计数器.虚拟机栈.本地方法栈这3个区域随线程而生,随线程而灭,随着方 ...

随机推荐

  1. linux中awk工具的使用(转载)

    awk是一个非常好用的数据处理工具.相较于sed常常一整行处理,awk则比较倾向于一行当中分成数个“字段”处理,awk处理方式如下: $ awk '条件类型1{动作1} 条件类型2{动作2} ...' ...

  2. DNS ------ windows执行DNS过程

    前言 TCP/IP协议是网络通讯的基础,平常在对TCP/IP协议设置时会涉及到IP地址,子网掩码,默认网关和DNS这几个参数.这里我们主要谈下IP地址和DNS这两个参数之间的关系. 首先计算机在网络中 ...

  3. Spark记录-Scala函数与闭包

    函数声明 Scala函数声明具有以下形式 - def functionName ([list of parameters]) : [return type] Scala 如果不使用等号和方法体,则隐式 ...

  4. C#的Struct

  5. SQL语句(六)成批导入导出数据

    (六) 成批导入导出数据 假设已经存在teaching数据库, 存在一张Student表,如图: 右键teaching->任务->导入数据 下一步->数据源(Microsoft Ex ...

  6. Spring RedisTemplate操作-Set操作(5)

    @Autowired @Resource(name="redisTemplate") private RedisTemplate<String, String> rt; ...

  7. Spring Mvc Web 配置拦截规则与访问静态资源 (三)

    拦截规则配置 1. *.do <!-- Processes application requests --> <servlet> <servlet-name>app ...

  8. iOS编码规范参考

    目录      注释 1.1  多行注释 1.2  单行注释 1.3  函数的注释   命名 2.1  常量的命名 2.2  函数的命名 2.3  变量的命名 2.3.1  成员变量 2.3.2  公 ...

  9. 在vue-cli下读取模拟数据请求服务器

    写此记录时vue脚手架的webpack是3.6.0 此文章方法亦可用于vue-cli3,直接在vue.config.js里面添加 本记录使用vue-resource,先安装: cnpm install ...

  10. thinkphp5学习总结!

    数据库操作之原生sql操作 <?php namespace app\index\controller; use think\Db; class Index { public function i ...