最近在工作中遇到了一个问题。

我认为对大家很有借鉴意义,于是在闲暇时间写了这篇博客。

需求,有8个集合List,相当于有8个实体。
这8个实体有7个实体有共同字段a,其中一个比较特殊,有两个字段,分别是b,c 需要我们将a,b,c 的值收集起来并且去重。

常规的写法

8个list,进行遍历,然后用一个hashset收集a,b,c。
我相信很多人都会用这种思维去写代码,意味着8个for循环轻松搞定!


思考一个问题,上面的写法有没有问题?能不能解决问题?

从功能上来说,的确这种写法完成了任务。

但是这种写法显然不够优雅。

下面推荐一种高端写法

巧用抽象和泛型,将代码提高一个档次。
高薪就离你越来越近了。


基于前面的8个对象的特点。

优雅写法一、

使用java8的函数式接口进行操作

* @author jinhua * @date 2021/6/24 16:22 @Data class Obj1 { private String a ; // ... 其他字段 @Data class Obj2 { private String a ; // ... 其他字段 @Data class Obj3 { private String b ; private String c ; // ... 其他字段 public class Main { public static void main ( String [ ] args ) { List < Obj1 > obj1s = new ArrayList < > ( ) ; // 假设又很多条数据 List < Obj2 > obj2s = new ArrayList < > ( ) ; // 假设又很多条数据 List < Obj3 > obj3s = new ArrayList < > ( ) ; // 假设又很多条数据 final HashSet < String > collectSet = new HashSet < > ( ) ; obj1s . forEach ( obj1 - > collectSet . add ( obj1 . getA ( ) ) ) ; obj2s . forEach ( obj1 - > collectSet . add ( obj1 . getA ( ) ) ) ; obj3s . forEach ( obj1 - > { collectSet . add ( obj1 . getB ( ) ) ; collectSet . add ( obj1 . getC ( ) ) ; } ) ;
优雅写法二、

抽象类、泛型、java8函数式接口
下面的优点在于可以复用这一整套逻辑

* @author jinhua * @date 2021/6/24 16:22 @Data class ObjFather { private String a ; private String b ; private String c ; @Data class Obj1 extends ObjFather { private String a ; // ... 其他字段 @Data class Obj2 extends ObjFather { private String a ; // ... 其他字段 @Data class Obj3 extends ObjFather { private String b ; private String c ; // ... 其他字段 public class Main { public static void main ( String [ ] args ) { List < Obj1 > obj1s = new ArrayList < > ( ) ; // 假设又很多条数据 List < Obj2 > obj2s = new ArrayList < > ( ) ; // 假设又很多条数据 List < Obj3 > obj3s = new ArrayList < > ( ) ; // 假设又很多条数据 final HashSet < String > collectSet = new HashSet < > ( ) ; // 加入集合set中 forEachAdd ( collectSet , obj1s ) ; forEachAdd ( collectSet , obj2s ) ; forEachAdd ( collectSet , obj3s ) ; * 遍历添加,可以复用 static < T extends ObjFather > void forEachAdd ( HashSet < String > set , List < T > list ) { list . forEach ( e - > { if ( e . getA ( ) != null ) { set . add ( e . getA ( ) ) ; } else { set . add ( e . getB ( ) ) ; set . add ( e . getC ( ) ) ; } ) ;