java8 lambda 求list最大值、最小值、平均值、求和、中位数、属性排序(空指针异常,空值排前、排后)、去重
java8 lambda 求list最大值、最小值、平均值、求和、中位数、属性排序(空指针异常,空值排前、排后)、去重
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 | import org.junit.Test; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; import static java.util.Comparator.comparingLong; import static java.util.stream.Collectors.*; /** * @Author: * @Date: 2018/12/12 13:08 * @Description: */ public class test { public static void main(String[] args) { List<User> list = new ArrayList<>(); list.add( new User(21L, "张三" )); list.add( new User(25L, "李四" )); list.add( new User(22L, "王五" )); list.add( new User(19L, "赵柳" )); list.add( new User(32L, "王5" )); list.add( new User(29L, "王6" )); list.add( new User(21L, "王7" )); // 对象根据年龄属性升序排序 List<User> newList = list.stream().sorted(Comparator.comparing(User::getAge)).collect(toList()); // 对象根据年龄属性降序排序 List<User> newList = list.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(toList()); // 标识升序,再按创建日期降序 // List<BhAnnouncement> newList = announcementList.stream().sorted(Comparator.comparing(BhAnnouncement::getReadFlag).thenComparing(BhAnnouncement::getSendTime).reversed()).collect(toList()); // list遍历 newList.forEach(System. out ::println); // 平均数 double asDouble = list.stream().mapToLong(User::getAge).average().getAsDouble(); System. out .println( "average:" + asDouble); double avg = list.stream().collect(Collectors.averagingLong(User::getAge)); System. out .println( "average:" + avg); // 最大值 long asLong = list.stream().mapToLong(User::getAge).max().getAsLong(); System. out .println( "max:" + asLong); // 最小值 long asLong1 = list.stream().mapToLong(User::getAge).min().getAsLong(); System. out .println( "min:" + asLong1); // 求和 long sum1 = list.stream().mapToLong(User::getAge).sum(); System. out .println( "sum:" + sum1); // 提取对象属性生成list List<Long> ids = list.stream().map(User::getAge).collect(toList()); System. out .println(ids); // list升序排序 Collections.sort(ids); System. out .println(ids); // 生成中位数 Long j; if (ids.size() % 2 == 0) { j = (ids. get (ids.size() / 2 - 1) + ids. get (ids.size() / 2)) / 2; System. out .println( "中位数为" + j); } else { j = ids. get (ids.size() / 2); System. out .println( "中位数为" + j); } // list倒序排序 ids.sort(Comparator.reverseOrder()); System. out .println(ids); //初始化: Student student1 = new Student( "1" , "2" ,90, new User( "1" , "2" ,10, "11" ), "" ); Student student2 = new Student( "2" , "3" ,840, new User( "4" , "2" ,10, "11" ), "" ); Student student3 = new Student( "3" , "4" ,80, new User( "3" , "2" ,10, "11" ), "" ); Student student4 = new Student( "4" , "7" ,90, new User( "2" , "2" ,10, "11" ), "" ); List<Student> students = new ArrayList<>(); students.add(student1); students.add(student2); students.add(student3); students.add(student4); //根据对象的子对象中的字段排序 List<Student> studentList = students.stream() .sorted(Comparator.comparing((Function<Student,String>)student -> student.getUser().getId()).reversed()) .collect(Collectors.toList()); // 根据对象的子对象中的字段排序 排序字段值为空,空值排在前面 List<Student> studentList1 = students.stream() .sorted(Comparator.comparing((Function<Student,String>)student -> student.getUser().getId() ,Comparator.nullsLast(String::compareTo)).reversed()) .collect(Collectors.toList()); //根据对象的子对象中的字段排序 排序字段值为空,空值排在后面 List<Student> studentList2 = students.stream() .sorted(Comparator.comparing((Function<Student,String>)student -> student.getUser().getId() ,Comparator.nullsFirst(String::compareTo)).reversed()) .collect(Collectors.toList()); // 去重 List<User> users = list.stream().collect(collectingAndThen(toCollection(() -> new TreeSet<>(comparingLong(User::getAge))), ArrayList:: new )); System. out .println( "去重:" +users); /** * List -> Map * 需要注意的是:toMap 如果集合对象有重复的key,会报错Duplicate key .... * apple1,apple12的id都为1。可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2 */ Map<Long, User> userMap = list.stream().collect(Collectors.toMap(User::getAge, a -> a, (k1, k2) -> k1)); System. out .println(userMap); //过滤出符合条件的数据 List<User> filterList = list.stream().filter(a -> a.getName(). equals ( "李四" )).collect(toList()); System. out .println( "filterList:" + filterList); List<Integer> list2 = Arrays.asList(1, 2, 3, 4, 5); int sum = list2.stream().reduce(0, (acc, value) -> acc + value); System. out .println(sum); List<Integer> result = list2.stream().filter((value) -> value > 2).collect(toList()); result.forEach(System. out ::println); List<String> result2 = list2.stream().map(value -> String.format( "String:%s" , value)).collect(toList()); result2.forEach(System. out ::println); // 用于收集统计数据的状态对象,例如count,min,max,sum和平均。 IntSummaryStatistics stats = list2.stream().mapToInt((x) -> x).summaryStatistics(); System. out .println( "Max : " + stats.getMax()); System. out .println( "Min: " + stats.getMin()); System. out .println( "Sun: " + stats.getSum()); System. out .println( "Average : " + stats.getAverage()); System. out .println( "Count : " + stats.getCount()); System. out .println( "toString : " + stats.toString()); } } class User { private Long age; private String name; public User(Long i, String s) { this .age = i; this .name = s; } public Long getAge() { return age; } public void setAge(Long age) { this .age = age; } public String getName() { return name; } public void setName(String name) { this .name = name; } @Override public String toString() { return "User [age=" + age + ", name=" + name + "]" ; } } List<Map> maps = Lists.newArrayList( Maps.newHashMap( "aa" , 10, "bb" , DateUtil.formatStringToDate( "2020-07-30" , "yyyy-MM-dd" )), Maps.newHashMap( "aa" , 10, "bb" , DateUtil.formatStringToDate( "2020-07-29" , "yyyy-MM-dd" )), Maps.newHashMap( "aa" , 16, "bb" , DateUtil.formatStringToDate( "2020-07-28" , "yyyy-MM-dd" )), Maps.newHashMap( "aa" , 16, "bb" , DateUtil.formatStringToDate( "2020-07-30" , "yyyy-MM-dd" )), Maps.newHashMap( "aa" , 20, "bb" , DateUtil.formatStringToDate( "2020-07-31" , "yyyy-MM-dd" )) ); // List<Map> 使用sorted排序时,单个字段排序没有问题, 但是使用thenComparing排序多个字段就会出现问题 maps = maps.stream().sorted(Comparator.comparing(a -> Long.parseLong(a. get ( "aa" ) + "" ))).collect(Collectors.toList()); maps.forEach(System.err::println); System.err.println( "===================5======================" ); // maps = maps.stream().sorted(Comparator.comparing(a -> Long.parseLong(a.get("aa") + "")).thenComparing(Comparator.comparing(a -> (Date) a.get("bb"), Comparator.reverseOrder()))).collect(Collectors.toList()); // 上面那种方式没法排序,但是直接使用list的sort排序却是可以的 Comparator<Map> aa = Comparator.comparing(a -> Long.parseLong(a. get ( "aa" ) + "" )); Comparator<Map> bb = Comparator.comparing(a -> (Date) a. get ( "bb" ), Comparator.reverseOrder()); maps.sort(aa.thenComparing(bb)); maps.forEach(System.err::println); //既然按照说是Java8的方式来排序,那就给一个按照java8的方式进行排序的代码吧 public class Test { public static void main(String[] args) { Map<String, Object> map = new HashMap<String, Object>(); map.put( "name" , "ZK" ); map.put( "age" , 13); Map<String, Object> map2 = new HashMap<String, Object>(); map2.put( "name" , "ZA" ); map2.put( "age" , 15); Map<String, Object> map3 = new HashMap<String, Object>(); map3.put( "name" , "CX" ); map3.put( "age" , 20); Map<String, Object> map4 = new HashMap<String, Object>(); map4.put( "name" , "CX" ); map4.put( "age" , 18); List<Map<String, Object>> list = new ArrayList<Map<String,Object>>(); list.add(map); list.add(map2); list.add(map3); list.add(map4); // 排序代码如下 List<Map<String, Object>> collect = list.stream().sorted(Comparator.comparing(Test::comparingByName) .thenComparing(Comparator.comparing(Test::comparingByAge).reversed())) .collect(Collectors.toList()); } private static String comparingByName(Map<String, Object> map){ return (String) map. get ( "name" ); } private static Integer comparingByAge(Map<String, Object> map){ return (Integer) map. get ( "age" ); } |
用到的一些Java8的东西
主要首先是stream了,list.stream()这里是把map的List集合变成map的流
然后就是Test::comparingByName这种中间加::表示方法引用
其次就是关键的stream.sorted()方法,参数是传一个比较器Comparator,这里由JDK自带的Comparator.comparing工具方法可以帮你构建一个按照xx属性进行比较的比较器,默认是升序
然后是比较器Comparator支持thenComparing方法,表示按照一定的比较顺序把各个比较连接起来比较
其次是比较器Comparator的reversed方法,可以让比较器的原始顺序逆序,这也正好满足题主需要按照age逆序排列的要求
最后就是collect()方法,把流的数据按照一定的方式收集起来,参数是一个收集器collector,这里用的是JDK自带的工具方法Collectors.toList把流的数据收集为集合
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix