java 8 两个list 相减_【精】【Java8】===两个List集合取交集、并集、差集

业务场景:根据用户查询权限,入参:UserCode,lastQueryTime(上次查询时间),出参:权限变化的列表。

oldList(上次查询到的权限列表),currList(当前查询到的权限列表),比对两个list找出:移除和增加的权限加以标识(1–增加,-1–删除)返回。

原逻辑处理方法:循环currList,如果oldList中不包含即为增加的权限列表,反之,循环oldList,如果currList中不包含即为移除的权限列表,代码如下(简略写没运行,比较笨拙):

//之前写的已经删了手动打下(add处有问题应该用map,将就着看吧)

List removeList =new ArrayList();

List addList =new ArrayList();

for(String old:currList){

if(!currList.contains(old)){

removeList.add(old,"-1")

}

}

for(String curr:oldList){

if(!oldList.contains(curr)){

addList.add(curr,"1")

}

}

用Java8中的 lambda表达式处理:

//AppAuths返回的变化列表

// 移除权限:上次与当前的权限取差集 (oldAppPrivileges - currAppPrivileges)

List removePrivileges = oldAppPrivileges.stream()

.filter(oldPrivilege ->!currAppPrivileges.contains(oldPrivilege)).collect(toList());

removePrivileges.parallelStream().forEachOrdered(removePrivilege ->

appAuths.add(new AppAuths(removePrivilege, "-1")));

// 增加权限:当前与上次的权限取差集 (currAppPrivileges - oldAppPrivileges)

List addPrivileges = currAppPrivileges.stream()

.filter(currPrivilege ->!oldAppPrivileges.contains(currPrivilege)).collect(toList());

addPrivileges.parallelStream().forEachOrdered(addPrivilege ->

appAuths.add(new AppAuths(addPrivilege, "1")));

逻辑其实是一样的,但下面的代码会给人一种高级的感觉(个人认为),性能方面下面的要好很多。

下面是:两个List集合取交集、并集、差集、去重并集的一个简单Demo,可供参考:

package com.ymdd.galaxy.appmanage.core.appauth.service;

import java.util.ArrayList;

import java.util.List;

import static java.util.stream.Collectors.toList;

public class Test {

public static void main(String[] args) {

List list1 = new ArrayList();

list1.add("1");

list1.add("2");

list1.add("3");

list1.add("5");

list1.add("6");

List list2 = new ArrayList();

list2.add("2");

list2.add("3");

list2.add("7");

list2.add("8");

// 交集

List intersection = list1.stream().filter(item -> list2.contains(item)).collect(toList());

System.out.println("---交集 intersection---");

intersection.parallelStream().forEach(System.out :: println);

// 差集 (list1 - list2)

List reduce1 = list1.stream().filter(item -> !list2.contains(item)).collect(toList());

System.out.println("---差集 reduce1 (list1 - list2)---");

reduce1.parallelStream().forEach(System.out :: println);

// 差集 (list2 - list1)

List reduce2 = list2.stream().filter(item -> !list1.contains(item)).collect(toList());

System.out.println("---差集 reduce2 (list2 - list1)---");

reduce2.parallelStream().forEach(System.out :: println);

// 并集

List listAll = list1.parallelStream().collect(toList());

List listAll2 = list2.parallelStream().collect(toList());

listAll.addAll(listAll2);

System.out.println("---并集 listAll---");

listAll.parallelStream().forEachOrdered(System.out :: println);

// 去重并集

List listAllDistinct = listAll.stream().distinct().collect(toList());

System.out.println("---得到去重并集 listAllDistinct---");

listAllDistinct.parallelStream().forEachOrdered(System.out :: println);

System.out.println("---原来的List1---");

list1.parallelStream().forEachOrdered(System.out :: println);

System.out.println("---原来的List2---");

list2.parallelStream().forEachOrdered(System.out :: println);

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 中可以使用 `java.time` 包中的 `Duration` 类来计算两个日期之间的时间差。示例代码如下: ```java import java.time.Duration; import java.time.LocalDateTime; public class Main { public static void main(String[] args) { LocalDateTime start = LocalDateTime.of(2022, 1, 1, 0, 0); LocalDateTime end = LocalDateTime.of(2022, 12, 31, 23, 59); Duration duration = Duration.between(start, end); System.out.println(duration); } } ``` 这样的话就会得到一个包含天数,小时数,分钟数和秒数的时间差。 如果只需要知道两个日期之间的天数差,可以使用 Period 类 ```java Period p = Period.between(start.toLocalDate(), end.toLocalDate()); long days = p.getDays(); ``` 这样可以得到两个日期之间的天数差 ### 回答2: 在Java中,可以使用java.time包中的LocalDate类来计算两个日期的差值。以下是一个示例代码: ```java import java.time.LocalDate; import java.time.temporal.ChronoUnit; public class DateDifference { public static void main(String[] args) { LocalDate date1 = LocalDate.of(2022, 1, 1); LocalDate date2 = LocalDate.of(2022, 12, 31); long days = ChronoUnit.DAYS.between(date1, date2); long months = ChronoUnit.MONTHS.between(date1, date2); long years = ChronoUnit.YEARS.between(date1, date2); System.out.println("两个日期相差的天数:" + days); System.out.println("两个日期相差的月数:" + months); System.out.println("两个日期相差的年数:" + years); } } ``` 在这个示例中,我们创建了两个LocalDate对象来表示要计算的日期。然后,使用`ChronoUnit`枚举类的`between`方法来计算两个日期之间的差值。`between`方法返回的是long类型的值,表示两个日期之间的天数、月数或年数。 以上代码的输出为: ``` 两个日期相差的天数:364 两个日期相差的月数:11 两个日期相差的年数:0 ``` 这表示两个日期相差364天,相差11个月,相差0年。 ### 回答3: 在Java中,可以使用`java.time.LocalDate`类来表示日期,并且可以使用`java.time.temporal.ChronoUnit`类来计算两个日期之间的差距。以下是一个示例代码: ```java import java.time.LocalDate; import java.time.temporal.ChronoUnit; public class DateSubtraction { public static void main(String[] args) { // 定义两个日期 LocalDate date1 = LocalDate.of(2022, 10, 1); LocalDate date2 = LocalDate.of(2022, 9, 20); // 计算两个日期之间的差距 long days = ChronoUnit.DAYS.between(date2, date1); // 输出结果 System.out.println("日期1与日期2之间相差" + days + "天"); } } ``` 上述代码中,我们首先使用`LocalDate.of()`方法创建了两个日期对象`date1`和`date2`,分别表示2022年10月1日和2022年9月20日。接着,我们使用`ChronoUnit.DAYS.between()`方法计算了`date2`和`date1`之间的天数差距,并将结果保存在`days`变量中。最后,我们通过`System.out.println()`方法输出了结果。 以上就是使用Java计算两个日期相减的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值