Java 1.8新特性使用记录:Filter、数据容器的转换、排序Sorted

简介: Java 1.8新特性使用记录有些方法一段时间不使用会忘记,这里要记录一下,方便以后使用一、过滤Filter二、数据容器的转换三、List 排序

一、过滤Filter
注意:符合条件的才返回。List的对象如果为null会报空指针,安全起见要加上判断

public class MyCar {
   
    private Integer id;
    private String name;
    private String number;
    private Integer age;
}

public static void myFilter() {
   
        List<MyCar> carList = new ArrayList<>();
        carList.add(new MyCar("c1",1));
        carList.add(new MyCar("c2",2));
        carList.add(new MyCar("c3",3));
        carList.add(new MyCar("c4",4));
        carList.add(new MyCar("c5",5));
        carList.add(null);
        //符合条件的才会返回
        carList = carList.stream().filter(e->e != null && e.getAge() >2).collect(Collectors.toList());

        carList.forEach(e->System.out.println(e));

    }

    public static void main(String[] args) {
   
        FilterDemo.myFilter();
    }

二、数据容器的转换
2.1、将对象数组一个属性抽出来变成List


//List的生成看上面
List<String> nameList = carList.stream().map(e->e.getName()).collect(Collectors.toList());
        nameList.forEach(e->System.out.println(e));

2.2、将对象List指定属性内容以逗号隔开,例如:name


//生产环境注意判断空
String nameStr = carList.stream().map(e->e.getName()).collect(Collectors.joining(","));
System.out.println(nameStr);
//c3,c4,c5

//上面也可以分成两步操作
nameList = carList.stream().map(e->e.getName()).collect(Collectors.toList());
nameStr = nameList.stream().collect(Collectors.joining(","));
System.out.println(nameStr);
//c3,c4,c5

三、List 排序

3.1.List排序,Integer,BigDecimal,Date可以一样使用
注意:判空是很重要的一步。null一般放在后面。下面都有介绍

public static void mySortedInteger() {
   
        //这里其中有一个为空的
        List<Integer> numList = Arrays.asList( 1,2,3,4,5,6,7,8,8,9,null,10);
        System.out.println(numList.stream().map(e->e+"").collect(Collectors.joining(",")));
        //默认升序,判空,null放在后面
        numList = numList.stream().sorted(Comparator.nullsLast(Integer::compareTo)).collect(Collectors.toList());
        //numList = numList.stream().sorted(Comparator.comparing(e->e,Comparator.nullsLast(Integer::compareTo))).collect(Collectors.toList());
        System.out.println(numList.stream().map(e->e+"").collect(Collectors.joining(",")));
        //默认升序,判空,null放在前面
        numList = numList.stream().sorted(Comparator.nullsFirst(Integer::compareTo)).collect(Collectors.toList());
        //numList = numList.stream().sorted(Comparator.comparing(e->e,Comparator.nullsFirst(Integer::compareTo))).collect(Collectors.toList());
        System.out.println(numList.stream().map(e->e+"").collect(Collectors.joining(",")));
        //降序,判空,null放在后面
        numList = numList.stream().sorted(Comparator.nullsLast(Comparator.reverseOrder())).collect(Collectors.toList());
        //numList = numList.stream().sorted(Comparator.comparing(e->e,Comparator.nullsLast(Comparator.reverseOrder()))).collect(Collectors.toList());
        System.out.println(numList.stream().map(e->e+"").collect(Collectors.joining(",")));
        //降序,判空,null放在前面
        numList = numList.stream().sorted(Comparator.nullsLast(Integer::compareTo).reversed()).collect(Collectors.toList());
        System.out.println(numList.stream().map(e->e+"").collect(Collectors.joining(",")));
        //当然可以加filter,但是这样长度就会减少
        //numList = numList.stream().filter(e->e != null).sorted(Comparator.comparing(e->e,Comparator.reverseOrder())).collect(Collectors.toList());
        numList = numList.stream().filter(e->e != null).sorted(Comparator.reverseOrder()).collect(Collectors.toList());
        System.out.println(numList.stream().map(e->e+"").collect(Collectors.joining(",")));
    }

3.2、对象数组
对象是使用率最高的,也需要注意判空!
跟上面的用法基本一致。

public static void mySortedTest() {
   
        List<MyCar> carList = new ArrayList<>();
        //初始化对象
        Calendar cal = Calendar.getInstance();
        carList.add(new MyCar("c1",1,cal.getTime(),new BigDecimal(1)));
        cal.add(Calendar.DAY_OF_MONTH, -1);
        carList.add(new MyCar("c2",2,cal.getTime(),new BigDecimal(2)));
        carList.add(new MyCar("c3",3,null,new BigDecimal(3)));
        cal.add(Calendar.DAY_OF_MONTH, 5);
        carList.add(new MyCar("c4",4,cal.getTime(),new BigDecimal(4)));
        cal.add(Calendar.DAY_OF_MONTH, 2);
        carList.add(new MyCar("c5",5,cal.getTime(),new BigDecimal(5)));
        carList.add(new MyCar("c6",null,cal.getTime(),new BigDecimal(5)));
        carList.add(new MyCar("c7",null,cal.getTime(),new BigDecimal(5)));
        System.out.println("原始顺序 :");
        //这里 Integer,BigDecimal,Date的排序使用大同小异,以Inter为例
        carList.forEach(e->System.out.println(e));
        System.out.println("Sorted by Age 升序,null放后面 :");
        carList = carList.stream().sorted(Comparator.comparing(MyCar::getAge,Comparator.nullsLast(Integer::compareTo))).collect(Collectors.toList());
        carList.forEach(e->System.out.println(e));
        System.out.println("Sorted by Age 升序,null放前面 :");
        carList = carList.stream().sorted(Comparator.comparing(MyCar::getAge,Comparator.nullsFirst(Integer::compareTo))).collect(Collectors.toList());
        carList.forEach(e->System.out.println(e));
        System.out.println("Sorted by Age 降序,null放在后面:");
        carList = carList.stream().sorted(Comparator.comparing(MyCar::getAge,Comparator.nullsFirst(Integer::compareTo)).reversed()).collect(Collectors.toList());
        carList.forEach(e->System.out.println(e));
        System.out.println("Sorted by Age 降序,null放在前面:");
        carList = carList.stream().sorted(Comparator.comparing(MyCar::getAge,Comparator.nullsLast(Integer::compareTo)).reversed()).collect(Collectors.toList());
        carList.forEach(e->System.out.println(e));
        //其它与Integer基本一样
        System.out.println("Sorted by Date 升序,null放在后面:");
        carList = carList.stream().sorted(Comparator.comparing(MyCar::getCreateDate,Comparator.nullsLast(Date::compareTo))).collect(Collectors.toList());
        carList.forEach(e->System.out.println(e));
    }
相关文章
|
9天前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
30天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
40 6
|
29天前
|
存储 Java API
深入剖析Java Map:不只是存储数据,更是设计艺术的体现!
【10月更文挑战第17天】在Java编程中,Map是一种重要的数据结构,用于存储键值对,并展现了设计艺术的精髓。本文深入剖析了Map的设计原理和使用技巧,包括基本概念、设计艺术(如哈希表与红黑树的空间时间权衡)、以及使用技巧(如选择合适的实现类、避免空指针异常等),帮助读者更好地理解和应用Map。
81 3
|
29天前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
57 2
|
30天前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
38 3
|
30天前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
32 2
|
10天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
25 2
|
10天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
19 2
|
12天前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
26 4
|
14天前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
37 2