Java8新特性

简介: 分组:↓Map result = items.stream().collect( Collectors.groupingBy(Item::getPrice, Collectors.

分组:↓

Map<BigDecimal, Set<String>> result =
                items.stream().collect(
                        Collectors.groupingBy(Item::getPrice,
                                Collectors.mapping(Item::getName, Collectors.toSet())
                        )
                );
Map<BigDecimal, Set<Object>> result =
                items.stream().collect(
                        Collectors.groupingBy(Item::getPrice)
              )
                ); Set
<Map<String, Object>> moduleProjectListGroup = moduleProjectList.stream(). collect(Collectors.groupingBy(e -> e.get("projectName"))).entrySet().stream().map(e -> { Map<String, Object> map = new HashMap<>(); map.put("moduleList", e.getValue()); map.put("projectName", e.getKey()); return map; }).collect(Collectors.toSet()); 其中moduleList是一个List<Map<String,Object>>数据类型

 

统计:↓

list.stream().mapToDouble(User::getHeight).sum()//
list.stream().mapToDouble(User::getHeight).max()//最大
list.stream().mapToDouble(User::getHeight).min()//最小
list.stream().mapToDouble(User::getHeight).average()//平均值 
其中支持还支持toInt, toLong,若是要统计BigDecimal则可以如下操作:
list.stream().map(User::getHeight).reduce(BigDecimal.ZERO, BigDecimal::add);

注意:以上都不会自动过滤null所以在使用的时候要结合filter使用过滤非法数据 


 

归约:↓

reduce(可以实现统计sum,min等操作以及字符串拼接)
int totalAge2 = students.stream()
                .filter(student -> "信息与计算科学".equals(student.getMajor()))
                    .map(Student::getAge)
                        .reduce(0, Integer::sum);

工作流程:过滤出信息与计算科学的学生,并对学生的成绩进行求和

比较:上面的做法和mapToInt效果相同

int totalAge = students.stream()
                        .filter(student -> "计算机科学".equals(student.getMajor()))
                            .mapToInt(Student::getAge).sum();

可以发现reduce的用法适用的范围较广,通过查询资料,sum,min,max以及average等都是特殊的reduce



过滤:↓
 1. filter(最基础的过滤操作):

(List<Student>)list.stream()
                   .filter(student -> "东华理工大学".equals(student.getSchool()))

工作流程:过滤东华理工大学的学生


2. distinct(带有去重的过滤操作,基于equals操作):

(List<Integer>)nums.stream()
                       .filter(num -> num % 2 == 0)
                         .distinct()
                          .collect(Collectors.toList());

工作流程:过滤除以2余数为0的数,并且去除重复的值输出,其中distinct是利用Integer的equals实现的

 

3. limit(过滤并限制输出的集合大小):

 (List<Student>)students.stream()
                          .filter(student -> "信息与计算科学".equals(student.getMajor()))
                            .limit(2)
                              .collect(Collectors.toList());

工作流程:先过滤出信息与计算科学的学生,然后选取前两个输出

 

4. sorted(过滤并实现排序):

(List<Student>)students.stream()
                                             .filter(student -> "信息与计算科学".equals(student.getMajor())).sorted((s1, s2) -> s1.getAge() - s2.getAge())
                                                .limit(2)
                                                    .collect(Collectors.toList());

工作流程:先过滤出信息与计算科学的学生,然后根据其年龄升序排序,并输出最前面两个


5. skip(过滤并跳过N个元素取其后面的元素):

List<Student> civilStudents = students.stream()
                                     .filter(student -> "信息与计算科学".equals(student.getMajor()))
                                         .skip(2)
                                            .collect(Collectors.toList());

工作流程:先过滤出信息与计算科学的学生,然后输出前两个学生之后的学生                



映射:↓
1.map(将某个对象映射成其他对象):

List<String> students.stream()
                            .filter(student -> "信息与计算科学".equals(student.getMajor()))
                                .map(Student::getName).collect(Collectors.toList());

工作流程:将信息与计算科学的学生list映射成名字list

 

2.flatMap(将一个流中的每个值都转成一个个流,然后再将这些流扁平化成为一个流 ):

List<String> list = Arrays.asList("hello welcome", "world hello", "hello world",  
            "hello world welcome");  
list.stream()
                  .flatMap(item -> Arrays.stream(item.split(" ")))
                    .distinct()
                        .collect(Collectors.toList())
                            .forEach(System.out::println); 

工作流程:先将每一个元素采用空格切割成一个数组,这样就会得到四个数组,然后将四个数组扁平化成一个数组去重输出

输出结果:hello  welcome  world



查找:↓
1.allMatch(匹配所有满足条件之后则返回true):

(List<Sdudent>)students.stream().allMatch(student -> student.getAge() >= 18);

工作流程:集合中所有学生年龄在18岁以上(包含18岁)则返回true否则false

同理有anyMatch(只要一个满足要求就返回true)、noneMatch(没有一个满足要求则返回true)

 

2.findFirst(返回满足条件的第一个元素):

List<Student>students.stream().filter(student -> "土木工程".equals(student.getMajor())).findFirst().get();

工作流程:略

同理有findAny(随机返回一个满足条件的元素)



资料参考:
探究原理参考资料:https://juejin.im/post/59c7d4c8f265da0650753328
总结以上参考资料:https://www.cnblogs.com/shenlanzhizun/p/6027042.html
java8中stream详细api参考资料:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/index.html
 

目录
相关文章
|
3天前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
14 3
|
7天前
|
安全 Java API
Java 17新特性让你的代码起飞!
【10月更文挑战第4天】自Java 8发布以来,Java语言经历了多次重大更新,每一次都引入了令人兴奋的新特性,极大地提升了开发效率和代码质量。本文将带你从Java 8一路走到Java 17,探索那些能让你的代码起飞的关键特性。
32 1
|
15天前
|
编解码 Oracle Java
java9到java17的新特性学习--github新项目
本文宣布了一个名为"JavaLearnNote"的新GitHub项目,该项目旨在帮助Java开发者深入理解和掌握从Java 9到Java 17的每个版本的关键新特性,并通过实战演示、社区支持和持续更新来促进学习。
53 3
|
2月前
|
安全 前端开发 Java
随着企业应用复杂度提升,Java Spring框架以其强大与灵活特性简化开发流程,成为构建高效、可维护应用的理想选择
随着企业应用复杂度提升,Java Spring框架以其强大与灵活特性简化开发流程,成为构建高效、可维护应用的理想选择。依赖注入使对象管理交由Spring容器处理,实现低耦合高内聚;AOP则分离横切关注点如事务管理,增强代码模块化。Spring还提供MVC、Data、Security等模块满足多样需求,并通过Spring Boot简化配置与部署,加速微服务架构构建。掌握这些核心概念与工具,开发者能更从容应对挑战,打造卓越应用。
40 1
|
2月前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
93 0
|
1天前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
9 3
|
4天前
|
Java 开发者
在Java的集合世界里,Set以其独特的特性脱颖而出,它通过“哈希魔法”和“红黑树防御”两大绝技
【10月更文挑战第13天】在Java的集合世界里,Set以其独特的特性脱颖而出。它通过“哈希魔法”和“红黑树防御”两大绝技,有效抵御重复元素的侵扰,确保集合的纯洁性和有序性。无论是“人海战术”还是“偷梁换柱”,Set都能从容应对,成为开发者手中不可或缺的利器。
18 6
|
1天前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
7 2
|
1天前
|
Java 开发者
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素。通过哈希表和红黑树两种模式,Set能够高效地识别并拒绝重复元素的入侵,确保集合的纯净。无论是HashSet还是TreeSet,都能在不同的场景下发挥出色的表现,成为开发者手中的利器。
10 2
|
1天前
|
Java
Java Set以其“不重复”的特性,为我们提供了一个高效、简洁的处理唯一性约束数据的方式。
【10月更文挑战第16天】在Java编程中,Set接口确保集合中没有重复元素,每个元素都是独一无二的。HashSet基于哈希表实现,提供高效的添加、删除和查找操作;TreeSet则基于红黑树实现,不仅去重还能自动排序。通过这两个实现类,我们可以轻松处理需要唯一性约束的数据,提升代码质量和效率。
9 2