java使用stream判断两个list元素的属性并输出方式

目录
  • 使用stream判断两个list元素的属性并输出
  • stream判断列表是否包含某几个元素/重复元素
    • 代码SHOW
    • Java stream判断列表是否包含重复元素

使用stream判断两个list元素的属性并输出

/**
* 使用stream判断两个list中元素不同的item
*/
@Test
public void test1(){
List<Param> stringList1 = new LinkedList<Param>(){{
    add(new Param(1,"1111"));
    add(new Param(2, "2222"));
    add(new Param(3, "3333"));
}};
List<Param> stringList2 = new LinkedList<Param>(){{
    add(new Param(1,"1111"));
    add(new Param(2, "4444"));
    add(new Param(3, "5555"));
}};
// 判断key相同,value相同的元素
Map<Integer, String> tmpList2 = stringList2.stream().collect(Collectors.toMap(Param::getId, Param::getName));
var tmplist = stringList1.stream().filter(item -> (tmpList2.get(item.getId()) != null && tmpList2.get(item.getId()).equals(item.getName()))).collect(Collectors.toList());
System.out.println(tmplist);
}
@Setter
@Getter
@ToString
@AllArgsConstructor
public static class Param{
private Integer id;
private String name;
}
/**
 * 使用stream判断两个list中元素不同的item
 */
@Test
public void test1(){
    List<Param> stringList1 = new LinkedList<Param>(){{
        add(new Param(1,"1111", "b"));
        add(new Param(2, "2222", "c"));
        add(new Param(3, "3333", "a"));
    }};
    List<Param> stringList2 = new LinkedList<Param>(){{
        add(new Param(1,"1111", "c"));
        add(new Param(2, "4444", "b"));
        add(new Param(3, "5555", "a"));
    }};
   // 判断key相同,value相同的元素
   Map<Integer, String> tmpList2 = stringList2.stream().collect(Collectors.toMap(Param::getId, Param::getName));
   var tmplist = stringList1.stream().filter(item -> (tmpList2.get(item.getId()) != null && tmpList2.get(item.getId()).equals(item.getName()))).collect(Collectors.toList());
   System.out.println(tmplist);
   // 如果需要判断多个值,直接将对象加入进去
   Map<Integer, Param> tmpList3 = stringList2.stream().collect(Collectors.toMap(Param::getId, Function.identity()));
   var tmplist2 = stringList1.stream().filter(item -> (tmpList3.get(item.getId()) != null && tmpList3.get(item.getId()).getType().equals(item.getType()))).collect(Collectors.toList());
   System.out.println(tmplist2);
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@EqualsAndHashCode
public static class Param{
    private Integer id;
    private String name;
    private String type;
}

stream判断列表是否包含某几个元素/重复元素

(需求经过修改过)判断一个profile是否包含PROFILE-IN-A和PROFILE-IN-B且都是Enable=1打勾的.

既然已经JDK8了,那就用lambda吧,如果是foreach可能比较难处理,用stream的filter则可以这样做.

核心代码可以这么写

int intCheck = profileServiceDtoList.stream().filter(e ->
            "1".equals(e.getEnable())
            &&(("PROFILE-IN-MOSHOW".equals(e.getServiceIdentifier()))||("PROFILE-IN-ADC".equals(e.getServiceIdentifier())))  
    ).collect(Collectors.toList()).size();

代码SHOW

  1. 新建三个不同类型的profile,其中两个是要判断的,一个是干扰的.
  2. 通过steam进行filter,找出是否包含这两个元素(相当于把要判断的元素过滤进去)
  3. 判断list的size大小(intCheck>1找到两个则代表同时出现)
public static void main(String[] args) {
    List<ProfileServiceDto> profileServiceDtoList= new ArrayList<>(3);
    
    ProfileServiceDto profileService1 = new ProfileServiceDto();
    profileService1.setServiceId(1001L);
    profileService1.setServiceIdentifier("PROFILE-IN-MOSHOW");
    profileService1.setEnable("1");
    profileServiceDtoList.add(profileService1);
    ProfileServiceDto profileService2 = new ProfileServiceDto();
    profileService2.setServiceId(1002L);
    profileService2.setServiceIdentifier("PROFILE-IN-ADC");
    profileService2.setEnable("1");
    profileServiceDtoList.add(profileService2);
    ProfileServiceDto profileService3 = new ProfileServiceDto();
    profileService3.setServiceId(1003L);
    profileService3.setServiceIdentifier("PROFILE-XXX-ABC");
    profileService3.setEnable("1");
    profileServiceDtoList.add(profileService3);
    int intCheck = profileServiceDtoList.stream().filter(e ->
            "1".equals(e.getEnable())&&(("PROFILE-IN-MOSHOW".equals(e.getServiceIdentifier()))||("PROFILE-IN-ADC".equals(e.getServiceIdentifier())))
    ).collect(Collectors.toList()).size();
    System.out.println("intCheck->"+intCheck);
    
    if(intCheck>1){
        System.error.println("In one profile, cannot contain two more PROFILE-IN profile.");
    }
}

Java stream判断列表是否包含重复元素

思路是通过一个distinct的list,然后跟原先的list来判断大小,如果不一致(原先list.size>distinctList.size)则表示有重复元素

        //profileServiceDtoList路上,不累赘
        //多了一个profileService1.setGroupId("A");profileService1.setGroupId("B");profileService3.setGroupId("A");
        List<String> groupList = new ArrayList<>(4);
        profileServiceDtoList.stream().forEach(e -> {
            if ("Y".equals(e.getEnable()) && StringUtils.isNotEmpty(e.getGroupId())) {
                groupList.add(e.getGroupId());
            }
        });
        int distinctGroupSize = groupList.stream().distinct().collect(Collectors.toList()).size();
        if (groupList.size() > distinctGroupSize) {
            throw new ValidationException("100001","In one profile, the services with the same groupId cannot co-exist.");
        }

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

(0)

相关推荐

  • Java8 Stream对两个 List 遍历匹配数据的优化处理操作

    使用场景,有两个List<Map<String,Object>>集合,第一个集合的所有元素都是需要保留的. 第一个集合的值为: {name=张三丰1, id=1} {name=张三丰2, id=2} {name=张三丰3, id=3} {name=张三丰4, id=4} {name=张三丰5, id=5} {name=张三丰6, id=6} {name=张三丰7, id=7} {name=张三丰8, id=8} 第二个集合的值为: {grade=61, id=1} {grade=6

  • jdk8使用stream实现两个list集合合并成一个(对象属性的合并)

    目录 一.前言 二.示例 示例1:java8 合并两个 list<map> 示例2:java8 合并两个 list<T> 示例3:java8 合并两个 list<T>,集合个数前者小于后者,要后者 示例4:java8 合并两个 list<T>,集合个数前者大于后者,要后者 java使用stream实现list中对象属性的合并:根据两个List中的某个相同字段合并成一条List,包含两个List中的字段 一.前言 为什么要用Lambda表达式和Stream流做

  • java8如何用Stream查List对象某属性是否有重复

    目录 使用Stream查List对象某属性是否有重复 练习一下stream的一些用法 list的五种去重方式 方法一:使用java8新特性stream进行List去重 方法二:双重for循环去重 方法三:set集合判断去重,不打乱顺序 方法四:遍历后判断赋给另一个list集合 方法五:set和list转换去重 使用Stream查List对象某属性是否有重复 Java8开发中,针对List对象集合,常需要判断某个属性是否存在重复值.用Stream流处理能方便的得到结果. 练习一下stream的一些

  • java使用stream判断两个list元素的属性并输出方式

    目录 使用stream判断两个list元素的属性并输出 stream判断列表是否包含某几个元素/重复元素 代码SHOW Java stream判断列表是否包含重复元素 使用stream判断两个list元素的属性并输出 /** * 使用stream判断两个list中元素不同的item */ @Test public void test1(){ List<Param> stringList1 = new LinkedList<Param>(){{ add(new Param(1,&qu

  • Java中Stream流去除List重复元素的方法

    本文实例为大家分享了Java中Stream流去除List重复元素的具体代码,供大家参考,具体内容如下 业务场景 在开发中我们常常需要过滤List中的重复对象,而重复的定义往往是根据单个条件或者多个条件,如果是单个条件的话还是比较好处理的,即使不使用工具,代码也可以很容易实现,但如果判断依据不是单个条件,而是多个条件的话,代码实现起来就会比较复杂,此时我们一般就会使用工具来简化开发 单条件去重代码 ArrayList<listData> collect = list.stream().colle

  • JavaScript 判断对象中是否有某属性的常用方法

    判断对象中是否有某属性的常见方式总结,不同的场景要使用不同的方式. 一.点( . )或者方括号( [ ] ) 通过点或者方括号可以获取对象的属性值,如果对象上不存在该属性,则会返回undefined.当然,这里的"不存在"指的是对象自身和原型链上都不存在,如果原型链有该属性,则会返回原型链上的属性值. // 创建对象 let test = {name : 'lei'} // 获取对象的自身的属性 test.name //"lei" test["name&q

  • Java 判断两个字符串是否由相同的字符组成的实例

    问题:由相同的字符组成是指两个字符串,字母以及各个字母的个数是相同的,只是顺序不同.如:"aaaabbc"与"abcbaaa"是由相同字符组成. 方法一:排序法,也是最容易想到的方法,将两个字符串转换为字节数组,分别排序后,判断是否相同即可. 方法二:集合法(空间换时间),利用Map集合key的唯一性,遍历第一个字符串,将字符作为key,字符出现的次数作为value,若遇到重复字符则将value+1.之后遍历第二个字符串,遇到字符就将对应的value-1,若valu

  • java理论基础Stream reduce实现集合元素归约

    目录 Integer类型归约 String类型归约 复杂对象归约 Combiner合并器的使用 并行流数据归约(使用合并器) Stream API为我们提供了Stream.reduce用来实现集合元素的归约.reduce函数有三个参数: Identity标识:一个元素,它是归约操作的初始值,如果流为空,则为默认结果. Accumulator累加器:具有两个参数的函数:归约运算的部分结果和流的下一个元素. Combiner合并器(可选):当归约并行化时,或当累加器参数的类型与累加器实现的类型不匹配

  • java理论基础Stream元素的匹配与查找

    目录 一.对比一下有多简单 二.其他匹配规则函数介绍 三.元素查找与Optional 在我们对数组或者集合类进行操作的时候,经常会遇到这样的需求,比如: 是否包含某一个“匹配规则”的元素 是否所有的元素都符合某一个“匹配规则” 是否所有元素都不符合某一个“匹配规则” 查找第一个符合“匹配规则”的元素 查找任意一个符合“匹配规则”的元素 这些需求如果用for循环去写的话,还是比较麻烦的,需要使用到for循环和break!本节就介绍一个如何用Stream API来实现“查找与匹配”. 一.对比一下有

  • Java一维数组和二维数组元素默认初始化值的判断方式

    目录 一.数组与数组元素 二.一维数组 1.元素为基本数据类型时 2. 数组元素为引用类型时 三.二维数组 1. int[][] arr = new int[2][2] 2. int[][] arr = new int[2][] 一.数组与数组元素 Java中数组是引用类型 数组的元素可以是基本类型也可以是引用类型,弄清数组元素的类型可以帮助我们去理解数组元素默认初始化 二.一维数组 一维数组元素默认初始化值的情况分为两种,元素为基本数据类型和引用数据类型 1.元素为基本数据类型时 整型类型(b

  • 如何在Java中判断两个Long类型是否相等

    目录 一.为什么同样的类型,同样的值,却不相等呢? 1.探索一下源码 二.解决方案 1.可以使用.longValue() 2.equals()进行比较 三.例子 一.为什么同样的类型,同样的值,却不相等呢? 1.探索一下源码 源码中显示,Long中有一个静态的内部类LongCache,专门用于缓存-128至127之间的值,一共256个元素. 如果值在[-128, 127]之间,会放在缓存里面,而超过这个范围就要new一个新的对象,也就是说==不能判断对象是否相等.当然,如果值是在[-128, 1

  • Java与JavaScript中判断两字符串是否相等的区别

    JavaScript是一种常用的脚本语言,这也决定了其相对于其他编程语言显得并不是很规范.在JavaScript中判断两字符串是否相等 直接用==,这与C++里的String类一样.而Java里的等号则是判断两字符串的引用是否一样,判断实体需要用equals()方法,或 者compareTo()方法,这里需要强调的是equals()方法的参数类型,其参数类型绝对不是String类,而是Object类,咱不止一次看 到国内一些教程写的是String类(o(╯□╰)o) 大家可以看看JDK的源码:

  • java 判断两个对象是否为同一个对象实例代码

    java 判断两个对象是否为同一个对象 用"=="比较的是引用的地址,用equals比较的就是值.那我们new两个相同的对象什么属性都一样,为什么编译的时候不相同,这是因为我们调用的是父类也就是Object的equals方法,这里我们就需要重写这个equals方法. public class Test5 { public static void main(String[] args) { User mUser1 = new User("zhangsan", &quo

随机推荐