java8新特性Stream流中anyMatch和allMatch和noneMatch的使用!!!

这篇具有很好参考价值的文章主要介绍了java8新特性Stream流中anyMatch和allMatch和noneMatch的使用!!!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、anyMatch

判断数据列表中是否存在任意一个元素符合设置的predicate条件,如果是就返回true,否则返回false。

接口定义:

boolean anyMatch(Predicate<? super T> predicate);

方法描述:

在anyMatch 接口定义中是接收 Predicate 类型参数,在Lamdba表达式中 Predicate<T> 是接收一个T类型参数,然后经过逻辑验证返回布尔值结果。这里anyMatch表示,判断的条件里,任意一个元素符合条件,就返回true值。

使用场景:

两个集合的交集

.........文章来源地址https://www.toymoban.com/news/detail-720679.html


    @Test
    public void a1() {
        List<User> list = new ArrayList<>();
        list.add(new User("张三", 12, "南京"));
        list.add(new User("李四", 13, "北京"));
        list.add(new User("王五", 14, "苏州"));
        list.add(new User("王五", 17, "苏州"));
        List<User> userList = new ArrayList<>();
        userList.add(new User("李四", 13, "北京"));
        userList.add(new User("王五", 20, "广州"));
        // 获取两个集合中有相同名字或者年龄相同的,只要满足其中一个条件即可,只会返回list集合里面的元素,有先后顺序返回
        List<User> users1 = list.stream()
                .filter(a -> userList.stream().anyMatch(b -> a.getName().equals(b.getName()) || a.getAge() == b.getAge()))
                .collect(Collectors.toList());
        // 获取两个集合中相同名字并且年龄相同的,必须同时满足两个条件
        List<User> users2 = list.stream()
                .filter(a -> userList.stream().anyMatch(b -> a.getName().equals(b.getName()) && a.getAge() == b.getAge()))
                .collect(Collectors.toList());
        users1.forEach(item -> {
            System.out.println(item.getName() + item.getAge() + item.getEmailAddress());
        });
        /** 第一种结果展示:
         * 李四13北京
         * 王五14苏州
         * 王五17苏州
         */
        users2.forEach(item -> {
            System.out.println(item.getName() + item.getAge() + item.getEmailAddress());
        });
        /** 第二种结果展示:
         * 李四13北京
         */
    }
 
 
@Test
public void a2() {
        Stream<String> stream = Stream.of("ac", "bcddddd", "bd");
        // 判断stream中其中任何一个元素中只要有包含b字符串或者l字符串就返回true
        boolean isMatch = stream.anyMatch(str -> str.contains("b") || str.contains("l"));
        System.out.println(isMatch);  // true
}

2、allMatch

判断数据列表中全部元素都符合设置的predicate条件,如果是就返回true,否则返回false,流为空时总是返回true。

接口定义:

boolean allMatch(Predicate<? super T> predicate);

方法描述:

在allMatch 接口定义中是接收 Predicate 类型参数,在Lamdba表达式中 Predicate<T> 是接收一个T类型参数,然后经过逻辑验证返回布尔值结果。这里allMatch表示,判断的条件里,全部元素符合条件,就返回true值。

适用场景:

基本类型的集合,但不适合于对象集合(我自己的理解)

allMatch里面不适合写 && ,只适合写 ||,如果写&&,编译器会自动报黄色波浪线

.......

@Test
public void a1() {
        List<String> typeList1 = Arrays.asList("1", "2");
        List<String> typeList2 = Arrays.asList("1", "2", "3", "4");
        // 集合列表中全部元素必须在allMatch里面的那些字符串,只要全部元素中有任意一个不同的元素在AllMatch中就返回false
        boolean isMatch1 = typeList1.stream().allMatch(a -> a.equals("1") || a.equals("2") || a.equals("3"));
        boolean isMatch2 = typeList2.stream().allMatch(a -> a.equals("1") || a.equals("2") || a.equals("3"));
        System.out.println(isMatch1);   // true
        System.out.println(isMatch2);   // false
}
 
 
@Test
public void a2() {
        Stream<String> stream = Stream.of("abc", "abc", "bcd");
        // 判断stream中全部所有元素必须全部包含b字符串和c字符串就返回true,如果有一个元素不包含这两个字符串就返回false
        boolean isMatch = stream.allMatch(str -> str.contains("b") && str.contains("c"));
        System.out.println(isMatch);  // true
}

3、noneMatch

判断数据列表中全部元素都不符合设置的predicate条件,如果是就返回true,否则返回false,流为空时总是返回true。

接口定义:

boolean noneMatch(Predicate<? super T> predicate);

方法描述:

在noneMatch接口定义中是接收 Predicate 类型参数,在Lamdba表达式中 Predicate<T> 是接收一个T类型参数,然后经过逻辑验证返回布尔值结果。这里noneMatch表示与allMatch相反,判断的条件里的元素,所有的元素都不符合,就返回true值。

适用场景:

两个集合的差集

.........

@Test
public void a1() {
        List<User> list = new ArrayList<>();
        list.add(new User("张三", 12, "南京"));
        list.add(new User("李四", 13, "北京"));
        list.add(new User("王五", 14, "苏州"));
        list.add(new User("王五", 17, "苏州"));
        List<User> userList = new ArrayList<>();
        userList.add(new User("李四", 13, "北京"));
        userList.add(new User("王五", 20, "广州"));
        // 获取list集合和userList集合过滤掉两者集合中名字和年龄相同的数据后,只返回list集合的数据
        List<User> users3 = list.stream()
                .filter(a -> userList.stream().noneMatch(b -> a.getName().equals(b.getName()) && a.getAge() == b.getAge()))
                .collect(Collectors.toList());
        // 获取userlist集合和list集合过滤掉两者集合中名字和年龄相同的数据后,只返回userList集合的数据
        List<User> users4 = userList.stream()
                .filter(a -> list.stream().noneMatch(b -> a.getName().equals(b.getName()) && a.getAge()==b.getAge()))
                .collect(Collectors.toList());
        // 获取list和userList集合之间的差集,将上面两者集合合并,就是两个集合的差集
        List<User> arrayList = new ArrayList<>();
        arrayList.addAll(users3);
        arrayList.addAll(users4);
        arrayList.forEach(item -> {
            System.out.println(item.getName() + item.getAge() + item.getEmailAddress());
        });
        /**  两者集合之间的差集
         * 张三12南京
         * 王五14苏州
         * 王五17苏州
         * 王五20广州
         */
        System.out.println("-------------------");
        users3.forEach(item -> {
            System.out.println(item.getName() + item.getAge() + item.getEmailAddress());
        });
        /**  只返回list集合中过滤掉之后的元素集合
         * 张三12南京
         * 王五14苏州
         * 王五17苏州
         */
        System.out.println("-------------------");
        users4.forEach(item -> {
            System.out.println(item.getName() + item.getAge() + item.getEmailAddress());
        });
        /**  只返回userList集合中过滤掉之后的元素集合
         * 王五20广州
         */
}
 
@Test
public void a2() {
        List<String> typeList1 = Arrays.asList("1", "2");
        List<String> typeList2 = Arrays.asList("1", "2", "3", "4");
        // 集合列表中全部元素只要都不在noneMatch里面的判断中,就返回true,集合列表中任何元素中只要有一个在noneMatch的判断中就返回false
        boolean isMatch1 = typeList1.stream().noneMatch(a -> a.equals("3") || a.equals("4"));
        boolean isMatch2 = typeList2.stream().noneMatch(a -> a.equals("1") || a.equals("2") || a.equals("3"));
        System.out.println(isMatch1);   // true
        System.out.println(isMatch2);   // false
}
 
/** noneMatch */
@Test
public void a3() {
        Stream<String> stream = Stream.of("dddd", "ee", "qqq", "bcfff");
        // 判断 stream 中所有的元素都不是以 a 开头,就返回true,如果所有的元素中只要其中一个元素是以a开头的,就返回false
        boolean isMatch = stream.noneMatch(str->str.startsWith("a"));
        System.out.println(isMatch);  // true
}

到了这里,关于java8新特性Stream流中anyMatch和allMatch和noneMatch的使用!!!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 带你走进Java8新特性Stream流的小世界

    目录 一. 什么是流(Stream) 1.1 流的定义 1.2 流的特点 1.3 操作流 1.4 创建流 二. 流的中间操作 2.1 流的筛选与切片 2.1.1 filter 2.1.2 limit 2.1.3 skip 2.1.4 distinct 2.2 流的映射 2.2.1 map 2.2.2 flatMap 2.3 流的排序 2.3.1 sort 三. 流的终止操作 3.1 流的查找与匹配 3.1.1 allMatch 3.1.2 anyMatch 3.1.3 none

    2024年01月24日
    浏览(62)
  • JAVA8新特性stream流收集为Map,value为null导致空指针的问题

    jdk8 新特性stream深受喜爱,平时使用比较多,其中有: MapString, String collect2 =  list.stream().collect(Collectors.toMap(Book::getName, Book::getIdNO,(pre, after) - pre));  现象如下: 问题:JDK8环境下,如果Book::getIdNo 为null的话会报空指针,即JDK8环境下的,该接口不支持value为null(key为null没这个问

    2024年02月06日
    浏览(68)
  • 使用java8 新特性stream流对List<Map<String, Object>>集合进行遍历、过滤、查询、去重、排序、分组

    对于一个ListMapString, Object类型的数据,可以使用Java 8的新特性stream流来进行遍历、过滤、查询、去重、排序、分组等操作。 遍历: 过滤: 查询: 去重: 排序: 分组:

    2024年02月10日
    浏览(69)
  • Java stream流中peek用法详解

    在Java中,Stream是一种用于处理集合数据的强大工具。它提供了一种函数式编程的方式来对数据进行操作和转换。Stream中的 peek 方法是一种非终端操作,它允许你在流的每个元素上执行一个操作,而不会改变流的内容。 peek 方法的语法如下: 其中, action 是一个接收一个元素并

    2024年02月05日
    浏览(51)
  • 【Java基础】Stream 流中 Collectors.toMap 的用法

    Collectors.toMap() 方法是把 List 转 Map 的操作 1.1、如果不是对象,是数组,怎么转成map? 按照规范来写的话,最好所有toMap,都要将这个异常提前考虑进去,不然有时候会报重复主键异常,这也是正例的写法,上面的属于反例的写法。 2.1、Collectors.toMap 有三个重载方法:  参数解

    2024年02月14日
    浏览(44)
  • JAVA07_Stream流中FindFirst方法查找元素第一个

    ①. Stream的findFirst方法在此流中查找第一个元素作为Optional,如果流中没有元素,findFirst返回空的Optional,如果findFirst选择的元素为null,它将抛出NullPointerException Optional findFirst() ②. findAny():返回流中的任意一个元素;如果流是空的,则返回空 对于串行流,输出的都是查找第一个元素 对于

    2024年02月12日
    浏览(46)
  • Java8 Stream流的合并

    最近的需求里有这样一个场景,要校验一个集合中每个对象的多个Id的有效性。比如一个Customer对象,有3个Id: id1 , id2 , id3 ,要把这些Id全部取出来,然后去数据库里查询它们是否存在。 通常情况下,我们都是从集合中取出对象的某一个字段,像这样: 现在要取3个字段,

    2024年02月02日
    浏览(53)
  • Java8 函数式编程stream流

    Java 8 中新增的特性旨在帮助程序员写出更好的代码,其中对核心类库的改进是很关键的一部分,也是本章的主要内容。对核心类库的改进主要包括集合类的 API 和新引入的流(Stream),流使程序员得以站在更高的抽象层次上对集合进行操作。下面将介绍stream流的用法。 ​场景

    2024年02月15日
    浏览(37)
  • Java8中Stream详细用法大全

    Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的Lambda ,给我们操作集合(Collection)提供了极大的便利。Stream流是JDK8新增的成员,允许以声明性方式处理数据集合,可以把Stream流看作是遍历数据集合的一个高级迭代器。Stream 是 Java8 中处理集合的关键抽

    2023年04月08日
    浏览(79)
  • Java8的Stream流的学习

    Stream可以由数组或集合创建,对流的操作分为两种: 中间操作,每次返回一个新的流,可以有多个。 终端操作,每个流只能进行一次终端操作,终端操作结束后流无法再次使用。终端操作会产生一个新的集合或值。 stream和parallelStream的简单区分: stream是顺序流,由主线程按

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包