返回顶部
首页 > 资讯 > 后端开发 > Python >Java8如何从一个Stream中过滤null值
  • 679
分享到

Java8如何从一个Stream中过滤null值

2024-04-02 19:04:59 679人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录从一个Stream中过滤null值Solution(解决)stream方法过滤条件的使用下面以List为例从一个Stream中过滤null值 复习一个Stream 包含 null

从一个Stream中过滤null值

复习一个Stream 包含 null 数据的例子.

Java8Examples.java

package com.mkyong.java8; 
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
 
public class Java8Examples { 
    public static void main(String[] args) { 
        Stream<String> language = Stream.of("java", "python", "node", null, "ruby", null, "PHP"); 
        List<String> result = language.collect(Collectors.toList()); 
        result.forEach(System.out::println); 
    }
}

output

java
Python
node
null   // <--- NULL
ruby
null   // <--- NULL
php

Solution(解决)

为了解决上面的问题,我们使用: Stream.filter(x -> x!=null)

Java8Examples.java

package com.mkyong.java8; 
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
 
public class Java8Examples { 
    public static void main(String[] args) { 
        Stream<String> language = Stream.of("java", "python", "node", null, "ruby", null, "php"); 
        //List<String> result = language.collect(Collectors.toList()); 
        List<String> result = language.filter(x -> x!=null).collect(Collectors.toList()); 
        result.forEach(System.out::println);  
    }
}

output

java
python
node
ruby
php

另外,过滤器还可以用: Objects::nonNull

import java.util.List;
List<String> result = language.filter(Objects::nonNull).collect(Collectors.toList());

stream方法过滤条件的使用

@Data 
@AllArgsConstructor    
public class User { 
    private Long id;      // id
    private Integer age;  // 年龄 
    private Byte gentle;  // 性别 
    private String name;  // 名字 
    private Integer rank; // 排名 
}
 
User user0 = new User(1L, 18, (byte) 0, "张三", 1); 
User user1 = new User(2L, 20, (byte) 1, "李四", 4); 
User user2 = new User(3L, 35, (byte) 0, "王五", 2); 
User user3 = new User(4L, 29, (byte) 1, "赵六", 3);

下面以List为例

实际上只要是Collection的子类,玩法都类似

1、生成stream

List<User> list = Arrays.asList(user0, user1, user2, user3);
Stream<User> stream = null;
stream = list.stream(); // 需要预判NPE
stream = Optional.of(list).orElseGet(Collections::emptyList).stream(); // 需要预判NPE
stream = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream();
stream = Optional.ofNullable(list).orElseGet(Collections::emptyList).parallelStream(); // 并行处理流
stream = Stream.of(user0, user1, user2, user3).parallel(); // 直接构造
stream = Stream.of(Arrays.asList(user0, user1), Arrays.asList(user2, user3)).flatMap(Collection::stream); // flatMap合并

2、stream操作

// 过滤出性别为0的user
List<User> userList = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream().filter(user -> (byte) 0 == user.getGentle()).collect(Collectors.toList());
 
// 获取排名大于1的用户年龄set
Set<Integer> ageList = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream().filter(user -> 1 < user.getRank()).map(User::getAge).collect(Collectors.toSet());
 
// 合计性别为0的user的年龄
Integer totalAge = Optional.ofNullable(userList).orElseGet(Collections::emptyList).stream().map(User::getAge).reduce(0, Integer::sum);
 
// 按排名倒序排列
List<User> sortedUserList = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream().sorted(Comparator.comparing(User::getRank, Comparator.reverseOrder())).collect(Collectors.toList());
 
// 获取排名第2高的user
User rankUser = Optional.ofNullable(sortedUserList).orElseGet(Collections::emptyList).stream().skip(1).findFirst().get();
 
// 排名最高的user
User highestRankUser = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream().max(Comparator.comparing(User::getRank)).get();
 
// 是否存在排名大于1的user
boolean flag = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream().anyMatch(user -> user.getRank() > 1);
 
// 是否所有user排名都大于1
boolean flag = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream().allMatch(user -> user.getRank() > 1);
 
// 是否所有user排名都不大于5
boolean flag = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream().noneMatch(user -> user.getRank() > 5);
 
// 按唯一id分组
Map<Long, User> idUserMap = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream().collect(Collectors.toMap(User::getId, Function.identity()));
 
// 按唯一id,名字分组
Map<Long, String> idNameMap = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream().collect(Collectors.toMap(User::getId, User::getName));
 
// 按年龄,名字分组,相同年龄的后出现的被覆盖
Map<Integer, String> ageNameMap = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream().collect(Collectors.toMap(User::getAge, User::getName, (a, b) -> a));
 
// 按性别分组
Map<Byte, List<User>> gentleUserMap = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream().collect(Collectors.groupingBy(User::getGentle));
 
// 按排名是否大于3分组
Map<Boolean, List<User>> partitionUserMap = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream().collect(Collectors.partitioningBy(user -> user.getRank() > 3));
 
// 按性别名字分组
Map<Byte, List<String>> gentleNameMap = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream().collect(Collectors.groupingBy(User::getGentle, Collectors.mapping(User::getName, Collectors.toList())));
 
// 按性别年龄总和分组
Map<Byte, Integer> gentleTotalAgeMap = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream().collect(Collectors.groupingBy(User::getGentle, Collectors.reducing(0, User::getAge, Integer::sum)));
 
// 迭代操作
Stream.iterate(0, i -> i + 1).limit(list.size()).forEach(i -> {
    System.out.println(list.get(i).getName());
});
 
// guava table转换
Table<Long, String, Integer> idNameRankTable = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream().map(user -> ImmutableTable.of(user.getId(), user.getName(), user.getRank())).collect(HasHBasedTable::create, HashBasedTable::putAll, HashBasedTable::putAll);
// stream只能被terminal一次,下面是错误示范
Stream<User> stream = Optional.ofNullable(list).orElseGet(Collections::emptyList).stream();
stream.collect(Collectors.toMap(User::getId, Function.identity()));
stream.collect(Collectors.toMap(User::getId, User::getName)); // java.lang.IllegalStateException: stream has already been operated upon or closed 
 
// ssc-common的com.meicloud.mcu.common.util.StreamUtil简单封装了一些流操作,欢迎试用 
// 参考资料:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/index.html

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Java8如何从一个Stream中过滤null值

本文链接: https://lsjlt.com/news/148053.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java8如何从一个Stream中过滤null值
    目录从一个Stream中过滤null值Solution(解决)stream方法过滤条件的使用下面以List为例从一个Stream中过滤null值 复习一个Stream 包含 null...
    99+
    2024-04-02
  • Spring boot详解fastjson过滤字段为null值如何解决
    目录前言环境解决方法后记前言 最近因项目需要,从零开始重新搭建了一套框架给同事们用。在前后端对接的时候,发现后端提供的字段缺少了很多,即实体类为null值的字段,全部被过滤了。经排查...
    99+
    2024-04-02
  • Java8如何从一个list中获取某一元素集合
    目录从一个list中获取某一元素集合提取出list中bean的某一属性从一个list中获取某一元素集合 @Data public class Person { private...
    99+
    2024-04-02
  • JS中如何判断一个值是否为Null
    前言 在鉴别JavaScript原始类型的时候我们会用到typeof操作符。Typeof操作符可用于字符串、数字、布尔和未定义类型。但是你运行typeof null时,结果是“object”(在逻辑上,你可以认为null是一个空的对象指针,...
    99+
    2023-09-01
    javascript 前端 java
  • 哪个 MySQL 函数用于从值列表中查找第一个非 NULL 值?
    我们可以使用 MySQL COALESCE() 函数从值列表中获取第一个非 NULL 值作为输出。换句话说,该函数将检查所有值,直到找到非空值。它可以采用一个或多个参数。它具有以下语法:COALESCE(value1, value2, &h...
    99+
    2023-10-22
  • Python如何实现过滤掉列表中唯一值
    小编给大家分享一下Python如何实现过滤掉列表中唯一值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、filter_uniquefrom colle...
    99+
    2023-06-25
  • java8如何根据list对象中的属性过滤筛选
    目录根据list对象中的属性过滤筛选根据性别筛选出所有的女同学list根据对象某个字段或多个字段去重、筛选、List转Map、排序、分组、统计计数等简单示例如下过滤筛选分组去重Lis...
    99+
    2024-04-02
  • 如何实现一个Laravel查询过滤器
    今天小编给大家分享一下如何实现一个Laravel查询过滤器的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。上下文在撰写本文时,...
    99+
    2023-07-05
  • jQuery如何创建一个嵌套的过滤器
    这篇文章给大家分享的是有关jQuery如何创建一个嵌套的过滤器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。创建一个嵌套的过滤器.filter(":not(:has(.selected))")...
    99+
    2023-06-27
  • python如何随机从列表中取出一个值
    使用`random.choice()`函数来随机从列表中取出一个值。这个函数接受一个可迭代对象作为参数,并随机返回其中的一个元素。下...
    99+
    2023-08-19
    python
  • MySQL中从库binlog如何使用mysqlbinlog stop-datetime过滤
    这篇文章主要介绍了MySQL中从库binlog如何使用mysqlbinlog stop-datetime过滤,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
    99+
    2024-04-02
  • JavaScript如何从整数中随机选取一个数值
    这篇文章主要介绍了JavaScript如何从整数中随机选取一个数值,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。从整数中,随机选取一个数值有...
    99+
    2024-04-02
  • golang中如何修改一个值
    Golang 是一种十分流行的编程语言,其简洁的语法、高性能以及并发特性,使得它在 Web 应用、网络编程等领域有着广泛的运用。在 Go 中,修改一个变量的值可能不太容易理解,本文将详细介绍 Go 中如何修改一个值。1. 值传递和引用传递在...
    99+
    2023-05-14
  • js如何从数组中获取惟一的值
    这篇文章主要为大家展示了“js如何从数组中获取惟一的值”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js如何从数组中获取惟一的值”这篇文章吧。从数组中获取惟一的值要从数组中获得唯一的值,需要使用...
    99+
    2023-06-27
  • 在MySQL中,我们如何将一个值从一种数字系统转换为另一种数字系统中的值?
    借助 MySQL CONV() 函数,可以将一种数字系统的值转换为另一种数字系统。语法CONV(N, from_base, to_base)这里,“N”是要转换的数字,“from_base”是该数字的当前基数,“to_bas...
    99+
    2023-10-22
  • VB中如何给一个数组赋值
    在VB中,可以使用`=`操作符来给数组赋值。可以通过以下两种方式来给数组赋值:1. 使用`Dim`关键字来声明数组,并使用`=`操作...
    99+
    2023-10-11
    VB
  • php数组中如何增加一个值
    这篇文章主要介绍“php数组中如何增加一个值”,在日常操作中,相信很多人在php数组中如何增加一个值问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php数组中如何增加一个值”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-30
  • Java反射机制,如何将一个实体类所有字段赋值为null
    目录将一个实体类所有字段赋值为null起因第一种方法第二种方法将实体类中的null属性置为““或者空值工具类测试类先创建需要的实体将一个实体类所有字段赋值为n...
    99+
    2024-04-02
  • 如何在Java项目中利用DFA算法实现一个过滤敏感字功能
    这期内容当中小编将会给大家带来有关如何在Java项目中利用DFA算法实现一个过滤敏感字功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。模式图直接上代码public class KeywordFilter...
    99+
    2023-05-31
    java dfa算法 ava
  • MySQL 8.0中如何通过Clone来实现一个远程从库的搭建
    这篇文章给大家分享的是有关MySQL 8.0中如何通过Clone来实现一个远程从库的搭建的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。环境如下Mater: 192.168.3.1...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作