公司网页网站建设 ppt,大兴网站开发公司,wordpress 手机pc,黄金网站app大全在项目中经常会遇到这样的场景#xff0c;就是一个list#xff0c;根据某种规则#xff0c;我要去判断里面是不是有重复的项。
难度不高#xff0c;但有点烦#xff0c;所以专门开一篇文章来记录一下#xff0c;争取弄一个相对简洁的写法。
先看一个简单的例子#xf…在项目中经常会遇到这样的场景就是一个list根据某种规则我要去判断里面是不是有重复的项。
难度不高但有点烦所以专门开一篇文章来记录一下争取弄一个相对简洁的写法。
先看一个简单的例子
//有一个list里面是long类型的数字集合
ListLong numbers new ArrayList();
numbers.add(1L);
numbers.add(2L);
numbers.add(2L);
numbers.add(3L);
numbers.add(4L);
numbers.add(5L);//判断里面是否有重复
DistinctUtil util new DistinctUtil();
System.out.println(util.distinctList(numbers).size() numbers.size());
DistinctUtil是另外写的一个工具类以下是distinctList方法
public ListT distinctList(ListT rawList) {return rawList.stream().map(item - item).distinct().collect(Collectors.toList());
} 这是一个泛型方法 distinctList它接受一个 List 类型的参数 rawList返回一个经过去重处理的 List。 具体来说该方法使用 Java 8 中的 Stream API 来对 rawList 进行操作。
首先使用 stream() 把 rawList 转换为一个 Stream。然后我们用map方法对每个元素进行了一个映射就是把元素本身映射为元素本身这一步看似无意义但其实它是为了强制把 List 转化为 Stream。
接下来在数据流中使用 distinct() 去重最后用 collect(Collectors.toList()) 方法把处理后的数据流转换为 List 类型并返回。
因为numbers是有重复元素的所以结果是false。
进一步优化如果的复杂类型怎么办呢
比如有一个User类
Data
Builder
public class User {String name;Integer age;
}
我要根据姓名是否有重复来判断就得修改一下逻辑。
public ListT distinctComplexList(ListT rawList, Function? super T,? mapLogic) {return (ListT) rawList.stream().map(item - mapLogic.apply(item)).distinct().collect(Collectors.toList());
}
这个方法可以用来从一个包含复杂元素的列表中提取指定属性去重并返回新列表。 该方法接收两个参数原始列表 rawList 和用于提取指定属性的函数接口 mapLogic。该方法使用 Java 8 的 Stream API 处理原始列表首先使用 map() 方法对每个元素进行属性提取然后使用 distinct() 方法去重最后使用 collect() 方法将 Stream 转换为列表并返回。
测试
//判断里面是否有重复
DistinctUtilUser util new DistinctUtil();ListUser users Arrays.asList(User.builder().name(鲁班七号).age(10).build(),User.builder().name(鲁班七号).age(10).build(),User.builder().name(安其拉).age(10).build()
);FunctionUser, String getName User::getName;
System.out.println(util.distinctComplexList(users, User::getName ).size() users.size());
注意使用DistinctUtil的时候一定要加泛型不然User::getName的使用会有问题会报一个Non-static method cannot be referenced from a static context的错误。
对应的可以再封装两个判断是否重复的方法
public boolean isRepeat(ListT rawList){return distinctList(rawList).size() rawList.size();
}public boolean isRepeat(ListT rawList, Function? super T,? mapLogic){return distinctList(rawList).size() rawList.size();
}
现在还有个问题每次用这个工具类还得先new出一个对象来有点麻烦。
我之前试过方法如果加了static就不能用T了。其实这并不是说静态方法不能用类的泛型参数而是如果你要用类的泛型参数这个方法也得是泛型方法。
举个栗子
public static T ListT distinctList(ListT rawList) {return rawList.stream().map(item - item).distinct().collect(Collectors.toList());
}
搞定了。 本文主要就是做一个记录我是jdk1.7的忠实粉丝lamda表达式用起来还是有点磕磕绊绊后面要加油了。