1.8新特性-List
作者:互联网
JAVA8新特性之List的各种用法(最大、最小、平均值、分组、求和、遍历、过滤、排序、去重、获取List中单个字段集合、List转map)
User实体类:
package com.mock.utils; import java.math.BigDecimal; import java.util.Date; public class User { /** * ID */ private Long id; /** * 用户名 */ private String name; /** * 年龄 */ private int age; /** * 工号 */ private String jobNumber; /** * 性别 */ private String sex; /** * 注册时间 */ private Date entryDate; /** * 成员组织 */ private BigDecimal familyMemberQuantity; private Long userId; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getJobNumber() { return jobNumber; } public void setJobNumber(String jobNumber) { this.jobNumber = jobNumber; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getEntryDate() { return entryDate; } public void setEntryDate(Date entryDate) { this.entryDate = entryDate; } public BigDecimal getFamilyMemberQuantity() { return familyMemberQuantity; } public void setFamilyMemberQuantity(BigDecimal familyMemberQuantity) { this.familyMemberQuantity = familyMemberQuantity; } public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + ", jobNumber=" + jobNumber + ", sex=" + sex + ", entryDate=" + entryDate + ", familyMemberQuantity=" + familyMemberQuantity + ", userId=" + userId + "]"; } }View Code
最大、最小、平均值、求和
1 package com.mock.utils; 2 3 import java.math.BigDecimal; 4 import java.util.ArrayList; 5 import java.util.Comparator; 6 import java.util.Date; 7 import java.util.List; 8 import java.util.Random; 9 10 import org.junit.Test; 11 12 public class TestList { 13 /** 14 * 生产虚拟用户 15 * 16 * @return 17 */ 18 public static List<User> produceUser() { 19 List<User> UserList = new ArrayList<>(); 20 for (int i = 1; i <= 10; i++) { 21 User User = new User(); 22 User.setId(Long.valueOf(i)); 23 User.setName("kobe" + i); 24 User.setAge(15 + new Random().nextInt(5)); 25 User.setJobNumber("jobNumber" + i); 26 if (i % 2 == 0) { 27 User.setSex("男"); 28 } else { 29 User.setSex("女"); 30 } 31 User.setEntryDate(new Date()); 32 User.setFamilyMemberQuantity(new BigDecimal(i)); 33 UserList.add(User); 34 } 35 return UserList; 36 } 37 38 /** 39 * 根据年龄字段求总和 40 */ 41 @Test 42 public void getSumByStream() { 43 List<User> list = produceUser(); 44 int sum = list.stream().mapToInt(User::getAge).sum(); 45 System.out.println("共计:" + list.size() + "个用户,所有年龄总和为:" + sum); 46 // 求最大年龄 47 Integer integer = list.stream().map(User::getAge).max(Integer::compareTo).get(); 48 System.out.println(integer); 49 // 得到最大年龄对象 50 User user = list.stream().max(Comparator.comparingInt(User::getAge)).get(); 51 System.out.println(user); 52 // 求平均年龄 53 System.out.println(list.stream().mapToInt(User::getAge).average().getAsDouble()); 54 // 求最大年龄 55 System.out.println(list.stream().mapToInt(User::getAge).max().getAsInt()); 56 } 57 58 /** 59 * 根据List求和 60 */ 61 @Test 62 public void getListSumByJava8() { 63 List<Integer> listInt = new ArrayList<>(); 64 List<Double> listDoub = new ArrayList<>(); 65 for (int i = 0; i < 500; i++) { 66 listInt.add(new Random().nextInt(1000)); 67 listDoub.add(new Random().nextDouble()); 68 } 69 System.out.println("=======数值型Integer求和======"); 70 Integer integer = listInt.stream().reduce(Integer::sum).orElse(0); 71 System.out.println(integer); 72 System.out.println("=======数值型Double求和======"); 73 Double integer1 = listDoub.stream().reduce(Double::sum).orElse(0.00); 74 System.out.println(integer1); 75 // 取最大值 76 System.out.println(listInt.stream().reduce(Integer::max).orElse(0)); 77 System.out.println(listInt.stream().mapToInt(Integer::valueOf).max().getAsInt()); 78 // 取最小值 79 System.out.println(listInt.stream().reduce(Integer::min).orElse(0)); 80 // 取平均值 81 System.out.println(listInt.stream().mapToInt(Integer::valueOf).average().getAsDouble()); 82 } 83 84 /** 85 * 求最大最小值,根据业务类型选择合适的类型值 86 */ 87 @Test 88 public void maxOrMinByJava8() { 89 List<User> list = produceUser(); 90 // 根据mapTO**得到最大最小 ---写法一 91 double asDouble = list.stream().mapToDouble(User::getAge).max().getAsDouble(); 92 System.out.println("将最大值转换为Double类型进行展示,最大为:" + asDouble); 93 double asDouble1 = list.stream().mapToDouble(User::getAge).min().getAsDouble(); 94 System.out.println("将最小值转换为Double类型进行展示,最小为:" + asDouble1); 95 int asInt = list.stream().mapToInt(User::getAge).max().getAsInt(); 96 System.out.println("将最大值转换为Int类型进行展示,最大为:" + asInt); 97 // 根据map得到最大最小 ---写法二(推荐) 98 Integer integer = list.stream().map(User::getAge).max(Integer::compareTo).get(); 99 System.out.println("将最大值转换为字段对应类型进行展示,最大为:" + integer); 100 Integer integer1 = list.stream().map(User::getAge).min(Integer::compareTo).get(); 101 System.out.println("将最小值转换为字段对应类型进行展示,最小为:" + integer1); 102 } 103 104 /** 105 * 求最大最小值,根据业务类型选择合适的类型值 106 */ 107 @Test 108 public void avgByJava8() { 109 List<User> list = produceUser(); 110 double avgAge = list.stream().mapToDouble(User::getAge).average().getAsDouble(); 111 System.out.println("平均年龄为:" + avgAge); 112 } 113 114 }
分组:
1 package com.mock.utils; 2 3 import java.math.BigDecimal; 4 import java.util.ArrayList; 5 import java.util.Date; 6 import java.util.List; 7 import java.util.Map; 8 import java.util.Random; 9 import java.util.Set; 10 import java.util.stream.Collectors; 11 12 import org.junit.Test; 13 14 public class TestList { 15 /** 16 * 生产虚拟用户 17 * 18 * @return 19 */ 20 public static List<User> produceUser() { 21 List<User> UserList = new ArrayList<>(); 22 for (int i = 1; i <= 10; i++) { 23 User User = new User(); 24 User.setId(Long.valueOf(i)); 25 User.setName("kobe" + i); 26 User.setAge(15 + new Random().nextInt(5)); 27 User.setJobNumber("jobNumber" + i); 28 if (i % 2 == 0) { 29 User.setSex("男"); 30 } else { 31 User.setSex("女"); 32 } 33 User.setEntryDate(new Date()); 34 User.setFamilyMemberQuantity(new BigDecimal(i)); 35 UserList.add(User); 36 } 37 return UserList; 38 } 39 40 /** 41 * 分组 42 */ 43 @Test 44 public void groupByGender() { 45 List<User> list = produceUser(); 46 // 根据性别进行分组 47 Map<String, List<User>> collect = list.stream().collect(Collectors.groupingBy(User::getSex)); 48 Set<Map.Entry<String, List<User>>> entries = collect.entrySet(); 49 entries.forEach(item -> { 50 // 性别 男 / 女 51 String gender = item.getKey(); 52 // 男集合 / 女集合 53 List<User> UserList = item.getValue(); 54 System.out.println(gender); 55 UserList.forEach(user -> System.out.println(user)); 56 }); 57 } 58 }
过滤
1 package com.mock.utils; 2 3 import java.math.BigDecimal; 4 import java.util.ArrayList; 5 import java.util.Date; 6 import java.util.List; 7 import java.util.Random; 8 import java.util.stream.Collectors; 9 10 import org.junit.Test; 11 12 public class TestList { 13 /** 14 * 生产虚拟用户 15 * 16 * @return 17 */ 18 public static List<User> produceUser() { 19 List<User> UserList = new ArrayList<>(); 20 for (int i = 1; i <= 10; i++) { 21 User User = new User(); 22 User.setId(Long.valueOf(i)); 23 User.setName("kobe" + i); 24 User.setAge(15 + new Random().nextInt(5)); 25 User.setJobNumber("jobNumber" + i); 26 if (i % 2 == 0) { 27 User.setSex("男"); 28 } else { 29 User.setSex("女"); 30 } 31 User.setEntryDate(new Date()); 32 User.setFamilyMemberQuantity(new BigDecimal(i)); 33 UserList.add(User); 34 } 35 return UserList; 36 } 37 38 /** 39 * 过滤对象 40 */ 41 @Test 42 public void filterByJava8() { 43 List<User> list = produceUser(); 44 System.out.println("原始数据为:"); 45 System.out.println("==============过滤前的数据为==============="); 46 list.forEach(System.out::println); 47 // 筛选出年龄大于13岁小于18岁的对象 48 List<User> collect = list.stream().filter(s -> s.getAge() > 13 && s.getAge() < 18).collect(Collectors.toList()); 49 System.out.println("过滤结束后的数据为:"); 50 collect.forEach(System.out::println); 51 } 52 }
排序:
1 package com.mock.utils; 2 3 import java.math.BigDecimal; 4 import java.util.ArrayList; 5 import java.util.Comparator; 6 import java.util.Date; 7 import java.util.List; 8 import java.util.Random; 9 10 import org.junit.Test; 11 12 public class TestList { 13 /** 14 * 生产虚拟用户 15 * 16 * @return 17 */ 18 public static List<User> produceUser() { 19 List<User> UserList = new ArrayList<>(); 20 for (int i = 1; i <= 10; i++) { 21 User User = new User(); 22 User.setId(Long.valueOf(i)); 23 User.setName("kobe" + i); 24 User.setAge(15 + new Random().nextInt(5)); 25 User.setJobNumber("jobNumber" + i); 26 if (i % 2 == 0) { 27 User.setSex("男"); 28 } else { 29 User.setSex("女"); 30 } 31 User.setEntryDate(new Date()); 32 User.setFamilyMemberQuantity(new BigDecimal(i)); 33 UserList.add(User); 34 } 35 return UserList; 36 } 37 38 /** 39 * 排序(单字段/多字段排序) 40 */ 41 @Test 42 public void sortByJava8() { 43 List<User> list = produceUser(); 44 System.out.println("============未排序的数据============="); 45 list.forEach(System.out::println); 46 try { 47 // 单字段排序,根据名字排序 48 System.out.println("============单字段排序,根据年龄排序 从小到大============="); 49 list.sort(Comparator.comparing(User::getAge)); 50 list.forEach(System.out::println); 51 System.out.println("============单字段排序,根据年龄排序 从大到小============="); 52 list.sort(Comparator.comparing(User::getAge).reversed()); 53 list.forEach(System.out::println); 54 // 多字段排序,根据年龄再根据-->名字排序 55 System.out.println("============多字段排序,根据年龄再根据-->名字排序 年龄从小到大============="); 56 list.sort(Comparator.comparing(User::getAge, (o1, o2) -> o1 - o2).thenComparing(User::getName)); 57 list.forEach(System.out::println); 58 System.out.println("============多字段排序,根据年龄再根据-->名字排序 年龄从大到小============="); 59 list.sort(Comparator.comparing(User::getAge, (o1, o2) -> o2 - o1).thenComparing(User::getName)); 60 list.forEach(System.out::println); 61 } catch (Exception e) { 62 e.printStackTrace(); 63 } 64 } 65 }
去重:
1 /** 2 * 去重 3 */ 4 @Test 5 public void distinctByJava8() { 6 List<String> numList = new ArrayList<>(); 7 numList.add("kevin"); 8 numList.add("kevin"); 9 numList.add("kevin1"); 10 numList.add("kevin2"); 11 numList.add("kevin1"); 12 numList.add("kevin2"); 13 System.out.println("===========未去重的数据============"); 14 System.out.println(numList.toString()); 15 System.out.println("===========去重后的数据============"); 16 List<String> collect = numList.stream().distinct().collect(Collectors.toList()); 17 System.out.println(collect.toString()); 18 }
得到两个集合的交集:
1 @Test 2 public void listBingByJava8() { 3 System.out.println("==========交集: 集合A {1,2,3} 和集合B {2,3,4} 的交集为 {2,3}。即{1,2,3}∩{2,3,4}={2,3}=========="); 4 List<String> list1 = new ArrayList<>(); 5 list1.add("aaa"); 6 list1.add("bbb"); 7 list1.add("ccc"); 8 list1.add("aaa1"); 9 System.out.println("list1:"); 10 list1.forEach(System.out::println); 11 List<String> list2 = new ArrayList<>(); 12 list2.add("ddd"); 13 list2.add("aaa"); 14 list2.add("eee"); 15 list2.add("ccc"); 16 list2.add("fff"); 17 list2.add("aaa1"); 18 list2.add("aaa2"); 19 System.out.println("list2:"); 20 list2.forEach(System.out::println); 21 // 合并List 22 List<String> collect = list1.stream().filter(s -> list2.contains(s)).collect(Collectors.toList()); 23 System.out.println("============交集元数据==========="); 24 System.out.println(collect); 25 // 获得元素出现频率的 Map,键为元素,值为元素出现的次数 26 System.out.println("============List1中添加List2==========="); 27 list1.addAll(list2); 28 list1.forEach(System.out::println); 29 List<String> collect1 = list1.stream().collect(Collectors.toMap(a -> a, a -> 1, (a, b) -> a + b)) 30 // Set<Entry>转换为Stream<Entry> 31 .entrySet().stream() 32 // 过滤出元素出现次数大于 0 的 entry 33 .filter(entry -> entry.getValue() > 1) 34 // 获得 entry 的键(重复元素)对应的 Stream 35 .map(entry -> entry.getKey()) 36 // 转化为 List并去重 37 .distinct().collect(Collectors.toList()); 38 System.out.println("========合并后得到处理得到重复的数据========"); 39 System.out.println(collect1); 40 }
List转map:
1 package com.mock.utils; 2 3 import java.math.BigDecimal; 4 import java.util.ArrayList; 5 import java.util.Date; 6 import java.util.List; 7 import java.util.Map; 8 import java.util.Optional; 9 import java.util.Random; 10 import java.util.stream.Collectors; 11 12 import org.junit.Test; 13 14 public class TestList { 15 /** 16 * 生产虚拟用户 17 * 18 * @return 19 */ 20 public static List<User> produceUser() { 21 List<User> UserList = new ArrayList<>(); 22 for (int i = 1; i <= 10; i++) { 23 User User = new User(); 24 User.setId(Long.valueOf(i)); 25 User.setName("kobe" + i); 26 User.setAge(15 + new Random().nextInt(5)); 27 User.setJobNumber("jobNumber" + i); 28 if (i % 2 == 0) { 29 User.setSex("男"); 30 } else { 31 User.setSex("女"); 32 } 33 User.setEntryDate(new Date()); 34 User.setFamilyMemberQuantity(new BigDecimal(i)); 35 UserList.add(User); 36 } 37 return UserList; 38 } 39 40 /** 41 * List -> Map <br> 42 * 需要注意的是: toMap 如果集合对象有重复的key,会报错Duplicate key .... user1,user2的id都为1。 <br> 43 * 可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2 44 */ 45 @Test 46 public void mapToListByJava8() { 47 List<User> list = produceUser(); 48 Map<Long, User> map = list.stream().collect(Collectors.toMap(User::getId, a -> a, (k1, k2) -> k1)); 49 for (Map.Entry<Long, User> entry : map.entrySet()) { 50 Long key = entry.getKey(); 51 System.out.println("map中的key是:" + key); 52 System.out.println("map中的value是:" + entry.getValue().toString()); 53 } 54 55 // 根据ID和年龄获得map 56 Map<Long, Integer> collect = list.stream().collect( 57 Collectors.toMap(User::getId, item -> Optional.ofNullable(item.getAge()).orElse(0), (k1, k2) -> k1)); 58 System.out.println(collect.toString()); 59 } 60 61 }
获取List中单个字段集合
1 package com.mock.utils; 2 3 import java.math.BigDecimal; 4 import java.util.ArrayList; 5 import java.util.Date; 6 import java.util.List; 7 import java.util.Random; 8 import java.util.stream.Collectors; 9 10 import org.junit.Test; 11 12 public class TestList { 13 /** 14 * 生产虚拟用户 15 * 16 * @return 17 */ 18 public static List<User> produceUser() { 19 List<User> UserList = new ArrayList<>(); 20 for (int i = 1; i <= 10; i++) { 21 User User = new User(); 22 User.setId(Long.valueOf(i)); 23 User.setName("kobe" + i); 24 User.setAge(15 + new Random().nextInt(5)); 25 User.setJobNumber("jobNumber" + i); 26 if (i % 2 == 0) { 27 User.setSex("男"); 28 } else { 29 User.setSex("女"); 30 } 31 User.setEntryDate(new Date()); 32 User.setFamilyMemberQuantity(new BigDecimal(i)); 33 UserList.add(User); 34 } 35 return UserList; 36 } 37 38 /** 39 * 获取单个字段集合 40 */ 41 @Test 42 public void getSingleField() { 43 List<User> list = produceUser(); 44 List<String> nameList = list.stream().map(User::getName).collect(Collectors.toList()); 45 nameList.forEach(System.out::println); 46 List<Integer> ageList = list.stream().map(User::getAge).collect(Collectors.toList()); 47 ageList.forEach(System.out::println); 48 } 49 50 }
标签:java,List,1.8,System,特性,println,import,out 来源: https://www.cnblogs.com/lixiuming521125/p/16434077.html