Stream流中将集合转成Map、List
- 实体类User
- 用例1 list转map,指定key-value,key,value是对象中的某个属性值
- 用例2 list转map 指定key-value,key为属性值,value是对象本身
- 用例3 list转map 指定key-value,value是对象本身,Function.identity()是简洁写法,返回对象本身
- 用例4 指定key-value,value是对象本身,Function.identity()是简洁写法,返回对象本身,遇到key 冲突的解决办法,选择第二个key的值value2覆盖第一个key的值value1。
- 用例5 指定key-value,按照name进行分组 value是对象集合
- 用例6 统计所有age
- 用例7 只对名称为zhangsan的age 进行统计汇总
- 用例8 获取最大age
- 用例9 循环打印
- 用例10 获取名称集合
- 用例11 不同实体之间的list转化,相同属性赋值
- 用例12 将Map<String,Integer>类型的值转为List
实体类User
/**
* 用户类
*/
public class User {
/**
* id
*/
private String id;
/**
* 名称
*/
private String name;
/**
* 年龄
*/
private Integer age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public User() {
}
public User(String id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
}
用例1 list转map,指定key-value,key,value是对象中的某个属性值
Map<String,String> userMap1 = userList.stream().collect(Collectors.toMap(User::getId,User::getName));
System.out.println("1->"+userMap1);
或
Map<String, String> map = list.stream().collect(Collectors.toMap(User::getUserId, User::getUserName, (key1, key2) -> key1));
用例2 list转map 指定key-value,key为属性值,value是对象本身
Map<String,User> userMap2 = userList.stream().collect(Collectors.toMap(User::getId,User->User));
System.out.println("2->"+userMap2);
用例3 list转map 指定key-value,value是对象本身,Function.identity()是简洁写法,返回对象本身
Map<String,User> userMap3 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));
System.out.println("3->"+userMap3);
用例4 指定key-value,value是对象本身,Function.identity()是简洁写法,返回对象本身,遇到key 冲突的解决办法,选择第二个key的值value2覆盖第一个key的值value1。
Map<String,User> userMap4 = userList.stream().collect(Collectors.toMap(User::getName, Function.identity(),(value1,value2)->value2));
System.out.println("4->"+userMap4);
或
Map<String, User> UserMap4 = list.stream().collect(Collectors.toMap(User::getId, u-> u, (existing, replacement) -> existing));
或
Map<String, User> UserMap4 = list.stream().collect(Collectors.toMap(User::getUserName, a -> a, (key1, key2) -> key1));
//(key1,key2)->key1 表示如果出现某两个值属于同一个键时,使用哪一个值,
//示例中表示当出现这种情况时使用前面的值,如果为key2就使用后面的值。
用例5 指定key-value,按照name进行分组 value是对象集合
Map<String, List<User>> userMap5 = userList.stream().collect(Collectors.groupingBy(User::getName));
System.out.println("5->"+userMap5);
用例6 统计所有age
Integer totalAge = userList.stream().map(User::getAge).reduce(0, Integer::sum);
System.out.println("6总年龄->"+totalAge);
用例7 只对名称为zhangsan的age 进行统计汇总
Integer totalAgeFilter = userList.stream().filter(t -> t.getName().equals("zhangsan")).map(User::getAge).reduce(0, Integer::sum);
System.out.println("7总年龄filter->"+totalAgeFilter);
用例8 获取最大age
Integer maxAge = userList.stream().map(User::getAge).max((x, y) -> x - y).get();
System.out.println("8最大年龄->"+maxAge);
用例9 循环打印
userList.stream().forEach(user -> System.out.println("9->"+user));
用例10 获取名称集合
List<String> nameList = userList.stream().map(User::getName).collect(Collectors.toList());
System.out.println("10名称集合->"+ JSON.toJSONString(nameList));
用例11 不同实体之间的list转化,相同属性赋值
List<A> aList = bList.stream().map(todo -> new A(todo.getName(), todo.getId(), todo.getAddress(), todo.getAge(), todo.getBirthday()))
.collect(Collectors.toList());
或
List<A> aList = bList.stream().map(b->{
A a = new A();
a.setName(b.getName());
a.setAddess(b.getAddress());
return a;
}).collect(Collectors.toList());
用例12 将Map<String,Integer>类型的值转为List
Map<String,Intrger> map = new HashMap<String,Intrger>();
map.put("a",1);
map.put("a",2);
map.put("a",3);
map.put("a",4);
List<Integer> list = map.values().stream().collect(Collectors.toList());