[Java SDK] [Collection] 一文玩转Java中的Lambda和Stream

简介: [Java SDK] [Collection] 一文玩转Java中的Lambda和Stream

方法 / 步骤

一:基本元素的操作

        List<Integer> sourceList =new ArrayList<>();
        sourceList.add(1);
        sourceList.add(2);
        sourceList.add(3);
        List<Integer> targetList=new ArrayList<>();
        targetList.add(3);
        targetList.add(4);
        targetList.add(5);

        //求与目标List的交集
        List<Integer> noChangeIds = sourceList.stream().filter(source -> targetList.contains(source)).collect(Collectors.toList());
        System.out.println("noChangeIds_"+noChangeIds.toString());
        
        //求与目标List的差集
        List<Integer> waitDelIds = sourceList.stream().filter(source -> !targetList.contains(source)).collect(Collectors.toList());
        System.out.println("waitDelIds" + waitDelIds.toString());
        
        //求与原list的差集
        List<Integer> waitInsert = targetList.stream().filter(target -> !sourceList.contains(target)).collect(Collectors.toList());
        System.out.println("waitInsert" + waitInsert.toString());

二: 对象元素的操作

2.1: List对象中操作

        /**
         * List对象中的交集并集差集
         */
        List<Person> personList = new ArrayList<>();
        Person person1 = new Person(1L,"小明",1,10);
        Person person2 = new Person(2L,"小红",2,11);
        Person person3 = new Person(3L,"小兰",2,10);
        Person person4 = new Person(3L,"小兰",2,10);



        personList.add(person4);
        personList.add(person3);
        personList.add(person2);
        personList.add(person1);
        personList.forEach(temp-> System.out.println(temp.toString()));
        /**
         * 去除重复的对象
         */
        //方法一:
        List<Person> distinctPersonList = removeReObjectById(personList);
        //方法二:
//        List<Person> distinctPersonList = personList.stream().collect(Collectors.collectingAndThen(Collectors
//                                    .toCollection(() -> new TreeSet<>(Comparator.comparing(Person::getId))), ArrayList::new));
        distinctPersonList.forEach(temp-> System.out.println("distinctPersonList_"+temp.toString()));
        System.out.println("======================================================");

        /**
         * 找出list中的对象,对应的参数出现了几次
         */
        Map<Long, Long> idRecount = personList.stream().collect(Collectors.groupingBy(person -> person.getId(), Collectors.counting()));
        idRecount.forEach((k,v)-> System.out.println("PersonID : "+k+"在List中出现了"+v+"次"));

        //找出List中重复的对象
        List<Long> reIds = new ArrayList<>();
        idRecount.forEach((k,v)->{if(v > 1){ reIds.add(k);}});
        List<Person> findReObjectById = personList.stream().filter(tempPerson -> reIds.contains(tempPerson.getId()))
                                        .collect(Collectors.collectingAndThen(Collectors
                                        .toCollection(() -> new TreeSet<>(Comparator.comparing(Person::getId))), ArrayList::new));
        findReObjectById.forEach(temp-> System.out.println("findReObjectByIdList"+temp.toString()));
    }

    private List<Person> removeReObjectById(List<Person> personList){
        Set<Person> peopleTreeSet = new TreeSet<>(Comparator.comparing(Person::getId));
        peopleTreeSet.addAll(personList);
        return new ArrayList<>(peopleTreeSet);
    }
  • 统计字符串总字符出现的次数
        /**
         * 统计字符串总字符出现的次数
         */
        Map<String, Integer> hashMap = new HashMap<>();
        String inputStr = "ABBCCCDDDDFFFFF";
        List<String> inputStrAsList = Arrays.asList(inputStr.split(""));
        inputStrAsList.forEach(var -> {
            hashMap.merge(var,1,Integer::sum);
        });

        hashMap.forEach((k,v)->{
            System.out.println("key: " + k + " 出现次数: " + v);
        });

2.2: List集合的转换

  • List 换装成Map
   /**
     * 以工号为key,实体内容为value List转换成map
     * 这个注意: 原始List中的实体Key是唯一的,如果不唯一后面的会实体会覆盖前面的
     * @param sourceList
     * @return
     */
    static Map<Long,Staff> list2Map(List<Staff> sourceList){
        //如果有重复Key这么写会报错 Java.lang.IllegalStateException:Duplicate key
        Map<Long, Staff> collect1 = sourceList.stream().collect(Collectors.toMap(Staff::getStaffNo, (var) -> var));
        //这么写如果有重复key后面的会覆盖前面的
        Map<Long, Staff> collect2 = sourceList.stream().collect(Collectors.toMap(Staff::getStaffNo, Function.identity(),(key1, key2) -> key2));
        return collect2;
    }


    static Map<String,List<Staff>> list2MapList(List<Staff> sourceList){
        //按照性别进行分组
        Map<String, List<Staff>> collect = sourceList.stream().collect(Collectors.groupingBy(Staff::getSex));
        //也可以按照工号进行分组
        Map<Long, List<Staff>> collect1 = sourceList.stream().collect(Collectors.groupingBy(Staff::getStaffNo));

        //partitioningBy可以理解为特殊的groupingBy,key值为true和false,当然此时方法中的参数为一个判断语句(用于判断的函数式接口)
        //把List中的元素按条件分区
        Map<Boolean, List<Staff>> collect2 = sourceList.stream().collect(Collectors.partitioningBy(e -> e.getAge() >= 18));
        System.out.println("满18岁的元素有"+ collect2.get(true).toString());
        return collect;
    }

参考资料 & 致谢

【1】Java8特性详解 lambda表达式 Stream
【2】java8新特性5:深入理解Java8 Lambda表达式

目录
相关文章
|
1月前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
57 6
|
1月前
|
Java API 开发者
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
|
2月前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
2月前
|
并行计算 Java 编译器
深入理解Java中的Lambda表达式
在Java 8中引入的Lambda表达式,不仅简化了代码编写,还提升了代码可读性。本文将带你探索Lambda表达式背后的逻辑与原理,通过实例展示如何高效利用这一特性优化你的程序。
|
2月前
|
搜索推荐 Java API
探索Java中的Lambda表达式
本文将深入探讨Java 8引入的Lambda表达式,这一特性极大地简化了代码编写,提高了程序的可读性。通过实例分析,我们将了解Lambda表达式的基本概念、使用场景以及如何优雅地重构传统代码。文章不仅适合初学者,也能帮助有经验的开发者加深对Lambda表达式的理解。
|
2月前
|
Java
探索Java中的Lambda表达式
【10月更文挑战第37天】本文将带你深入理解Java的Lambda表达式,从基础语法到高级特性,通过实例讲解其在函数式编程中的应用。我们还将探讨Lambda表达式如何简化代码、提高开发效率,并讨论其在实际项目中的应用。
|
24天前
|
Rust 安全 Java
Java Stream 使用指南
本文介绍了Java中Stream流的使用方法,包括如何创建Stream流、中间操作(如map、filter、sorted等)和终结操作(如collect、forEach等)。此外,还讲解了并行流的概念及其可能带来的线程安全问题,并给出了示例代码。
|
2月前
|
Java API
Java中的Lambda表达式与函数式编程####
【10月更文挑战第29天】 本文将深入探讨Java中Lambda表达式的实现及其在函数式编程中的应用。通过对比传统方法,我们将揭示Lambda如何简化代码、提高可读性和维护性。文章还将展示一些实际案例,帮助读者更好地理解和应用Lambda表达式。 ####
|
2月前
|
Java API 开发者
Java中的Lambda表达式与函数式编程####
在Java的演变过程中,Lambda表达式和函数式编程的引入无疑是一次重大的飞跃。本文将深入探讨Lambda表达式的定义、用法及优势,并结合实例说明如何在Java中利用Lambda表达式进行函数式编程。通过对比传统编程方式,揭示Lambda表达式如何简化代码、提高开发效率和可维护性。 ####
|
1月前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。