package com.leitao.demo.code;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collector;
import java.util.stream.Collectors;
/**
* @Description: TODO
* @Author Leo
* @Date 2023/1/3
* @Version V1.0
**/
public class streamDemo4 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"李1-男-38","范2宇-女-12","王3来-女-34","杨4亭-女-56","毛5培-男-23","马6云-男-43","大帅7-男-18");
//collect 收集流中的数据放到集合中(list\set\map)
//收集到list集合当中
// 需求:把所有的男性收集起来
List<String> newList = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toList());
System.out.println(newList);
System.out.println("===================华丽的分割线===================");
//set集合
//和收集到list集合的区别:元素去重,并且无序
Set<String> set = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toSet());
System.out.println(set);
System.out.println("===================华丽的分割线===================");
//收集map集合
//谁作为键,谁作为值
//需求:把所有的男性收集起来,键:姓名 ;值 :年龄
//首先保证集合中你想要作为键的的数据不能重复,保持键的唯一性
//toMap方法里面有两个参数,一个是键的规则另一个是值的规则
//Function的泛型第一个是原来流中数据的类型,第二个是键的数据类型
//"李1-男-38"
/**
* toMap : 参数一表示键的生成规则
* 参数二表示值的生成规则
* 参数一 :
* Function泛型一 : 表示流中的每一个数据的类型
* 泛型二 : 表示map集合中键的数据类型
*
* 方法apply形参 :依次表示流里面的每一个数据
* 方法体 :生成键的代码
* 返回值 :已经生成的键
* 参数二 :
* Function泛型一 : 表示流中的每一个数据的类型
* 泛型二 : 表示map集合中值的数据类型
*
* 方法apply形参 :依次表示流里面的每一个数据
* 方法体 :生成值的代码
* 返回值 :已经生成的值
*/
Collector<String, ?, Map<String, Integer>> stringMapCollector = Collectors.toMap(new Function<String, String>() {
@Override
public String apply(String s) {
return s.split("-")[0];
}
}, new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return Integer.parseInt(s.split("-")[2]);
}
});
Map<String, Integer> collect = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(stringMapCollector);
System.out.println(collect);
System.out.println("-------------------优化完-----------------");
Map<String, Integer> collect1 = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toMap((s -> s.split("-")[0]), (s -> Integer.parseInt(s.split("-")[2]))));
System.out.println(collect1);
}
}