Java集合Stream类filter的使用

简介: Java集合Stream类filter的使用

使用JDK1.8新加入的Streamfilter方法来实现过滤的效果。并且在实际项目中通常使用filter更多

// 这个方法是通过stream流的filter过滤值为空的元素
List<String> notEmptyTodaySales = todaySales.stream()
                                    .filter(t -> Objects.nonNull(t))
                                    .collect(Collectors.toList());
List<String> notEmptyYesterdaySales = yesterdaySales.stream()
                                    .filter(t -> bjects.nonNull(t))
                                    .collect(Collectors.toList());
// 这个方法是通过stream流将集合中的元素转为Double类型,然后再求和
double todaySalesSum = notEmptyTodaySales.stream()
                        .collect(Collectors.summarizingDouble(value -> Double.parseDouble(value))).getSum();
double yesterdaySalesSum = notEmptyYesterdaySales.stream()
                        .collect(Collectors.summarizingDouble(value -> Double.parseDouble(value))).getSum();

再举个简单的例子:

// 现有这样一个集合:Person对象有 姓名,年龄,性别 三个属性
Collection<Person> collection = new ArrayList();
collection.add(new Person("张三", 23, "男"));
collection.add(new Person("李四", 19, "女"));
collection.add(new Person("王五", 34, "男"));
collection.add(new Person("赵六", 39, "男"));
collection.add(new Person("田七", 25, "女"));
// 使用Lambda表达式的写法,通过filter过滤, 要求只保留女性
Stream<Person> personStream = collection.stream().filter(
        person -> "女".equals(person.getGender())
);
// 再将Stream转化为List
collection = personStream.collect(Collectors.toList());
// 查看结果
System.out.println(collection.toString());

运行结果如下:

[Person{name=’李四’, age=19, gender=’女’}, Person{name=’田七’, age=25, gender=’女’}]

在JDK1.8中,Collection以及其子类新加入了removeIf方法,作用是按照一定规则过滤集合中的元素。能和filter实现一样的功能,但是要注意用法与filter的差别。

// 过滤30岁以上的人, 返回的结果是年龄小于30风的人
collection.removeIf(
    person -> person.getAge() >= 30
);

运行结果:

[Person{name=’张三’, age=23, gender=’男’}, Person{name=’李四’, age=19, gender=’女’}, Person{name=’田七’, age=25, gender=’女’}]Person{name=’田七’, age=25, gender=’女’}]

不过一定要注意在使用filter时不要和removeIf弄混淆了:

  • removeIf中的test方法返回true代表当前元素会被过滤掉
  • filter中的test方法返回true代表当前元素会保留下来

 

其他同类知识点:

1、Java8中的Stream()与ParallelStream()的区别;

2、Java中的排序问题(Java8新特性 stream流、stream多字段排序);


相关文章
|
9天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
|
19天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
25 2
|
23天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
19天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
23天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
76 4
|
23天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
45 2
|
23天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
23天前
|
Java 开发者
|
23天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
22 0
|
Java
Java8中stream流处理数据21个小案例(学习使用)
Java8中stream流处理数据21个小案例(学习使用)
99 0