首页 > 编程语言 >java8 lambda 求list最大值、最小值、平均值、求和、中位数、属性排序(空指针异常,空值排前、排后)、去重

java8 lambda 求list最大值、最小值、平均值、求和、中位数、属性排序(空指针异常,空值排前、排后)、去重

时间:2023-04-25 16:12:30浏览次数:43  
标签:Comparator stream list System new println 排前 排后

点击查看代码
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把流的数据收集为集合   

标签:Comparator,stream,list,System,new,println,排前,排后
From: https://www.cnblogs.com/codeLearn/p/17352925.html

相关文章

  • EAS_在ListUIETCX.java中校验是否选中行
    /***对内背书*/publicvoidactionEndorseIn_actionPerformed(ActionEvente)/**/throwsException/**/{checkSelected();ArrayListidList=getSelectedIdValues();ReceivableBillCollec......
  • 直播商城源码,PopupWindow菜单在ListView中显示
    直播商城源码,PopupWindow菜单在ListView中显示  privatePopupWindowmOperaPopup;  privatevoidshowMenuPopup(Viewanchor)  {    if(mOperaPopup==null)    {      ViewpopupView=View.inflate(mContext,R.layout.popup_opera_sub......
  • EAS_字啊listUICTEX中获取选中的id
    @OverridepublicvoidactionInTransfer_actionPerformed(ActionEvente)/**/throwsException/**/{ArrayListidList=getSelectedIdValues();SelectorItemCollectionsic=newSelectorItemCollection();......
  • 逼真的刺绣Photoshop插件-Realistic Embroidery 3.0汉化版 Win/Mac版通用
    使用RealisticEmbroidery3.0插件只需单击几下,即可将文本、徽标或形状转换为逼真的刺绣/缝合元素。逼真的刺绣3现在是一个完整的Photoshop插件,具有界面、改进的工作流程和许多新功能,将使您的数字缝纫体验更加美好!如图所示,自己体验吧!Bevel我翻译成的倒角,或许有其他更好的翻译,自己......
  • pyspark list[dict]转pyspark df
    数据处理把list嵌套字段转成pysparkdataframe #coding=utf-8frompyspark.sqlimportSparkSessionfrompyspark.sql.typesimport*importpandasaspdfrompyspark.sqlimportRowclassSparkContext:def__init__(self,name="cleaner"):self.s......
  • listwidget 实现横向流式排布关键以及过滤注意事项
    listWidget里面设置以下属性:this->setViewMode(QListView::IconMode);this->setResizeMode(QListView::Adjust);this->setMovement(QListView::Static);流式排布过滤时需要注意:在流式排布中过滤item采用隐藏的方式时,因为采用的是IconMode模式,所以偶尔会出现排版......
  • [C#]中String、String[]、List<string>相互转换及string成员substring、split简单使用
    一、相互转换1.String>String[]Strings="a,b,c,d,e";String[]sArray=s.Split(',');2.String[]>Stringstring[]sArray={"a","b","c","d","e"};strings=String.Join(",......
  • C# 修改list所有对象中的某字段
    语法糖:ForEach(批量修改时候方便)最简单的方法就是用ForEachList<MyObject>myObject=newList<MyObject>();myObject.ForEach(w=>w.MyBool=true);......
  • 使用Plist编辑器——简单入门指南
     本指南将介绍如何使用Plist编辑器。您将学习如何打开、编辑和保存plist文件,并了解plist文件的基本结构和用途。跟随这个简单的入门指南,您将掌握如何使用Plist编辑器轻松管理您的plist文件。plist文件是一种常见的配置文件格式,用于存储应用程序或系统的设置信息,如键值对、......
  • Apple 的 plist 编辑器入门指南:基础操作与高级功能详解
     PlistEditPro是一款专为macOS编写的最高级属性列表Plist编辑器。对于Mac和IOS开发人员来说,编写应用程序时必须编辑各种列表文件。PlistEditPro通过提供直观且功能强大的界面,使编辑这些文件更加容易。它不仅能够复制和粘贴或拖放属性列表数据,还提供强大的搜索和替换功能,并......