2016-05-15 87 views
0

我有对象的列表,我们称之为IT模式Lambdaj组由扁平化列表

public class Model { 

String modelId; 

List<String> PropertyA; 
List<String> PropertyB; 
List<String> PropertyC; 

String modelCol1; 
String modelCol2; 
String modelCol3; 
String modelCol4; 

} 

的样本数据:

1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4" 

2, ["A", "B"], ["8", "9"], ["00112", "00113"], "colB1", "colB2", "colB3", "colB4" 

预计:

获取模型的列表内列出的元素然后由多个字段组成

"A", "7", "00111", [{1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4"}] 

"A", "7", "00112", [{1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4"}] 

"A", "8", "00111", [{1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4"}] 

"A", "8", "00112", [{1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4"}] 

"C", "7", "00111", [{1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4"}] 

"C", "7", "00112", [{1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4"}] 

"C", "8", "00111", [{1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4"}] 

"C", "8", "00112", [{1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4"}] 

"A", "8", "00113", [{2, ["A", "B"], ["8", "9"], ["00112", "00113"], "colB1", "colB2", "colB3", "colB4"}] 

"A", "9", "00112", [{2, ["A", "B"], ["8", "9"], ["00112", "00113"], "colB1", "colB2", "colB3", "colB4"}] 

"A", "9", "00113", [{2, ["A", "B"], ["8", "9"], ["00112", "00113"], "colB1", "colB2", "colB3", "colB4"}] 

。 ..

在这种情况下, “A”, “8”, “00112” 被捕获一次。对于每个组,首先选择或选择任何Model对象都是可以接受的。这可能使用LambdaJ?

我目前只列出了能集团的情况下直接提取从列表中各个元素。

Group<Model> grpResult = group(models, by(on(Model.class).getPropertyA()), by(on(Model.class).getPropertyB()), by(on(Model.class).getPropertyC())); 
returns 
[{children=[{children=[{children=[Model [modelId=null, PropertyA=[A, B], PropertyB=[7, 8], PropertyC=[00111, 00112], modelCol1=ACol1, modelCol2=ACol2, modelCol3=null, modelCol4=null]], propertyC=[00111, 00112]}], propertyB=[7, 8]}], propertyA=[A, B]}, 

{children=[{children=[{children=[Model [modelId=null, PropertyA=[A, C], PropertyB=[8, 9], PropertyC=[00112, 00113], modelCol1=BCol1, modelCol2=BCol2, modelCol3=null, modelCol4=null]], propertyC=[00112, 00113]}], propertyB=[8, 9]}], propertyA=[A, C]}] 

任何意见是非常感谢。

+0

谢谢Reto纠正我的格式!这是我的第一篇文章,我只格式化代码,但将来也会格式化数据。 – user777

回答

0

首先创建

class RefModel { 

String PropertyA; 
String PropertyB; 
String PropertyC; 
Model model; 
public RefModel(String propertyA, String propertyB, String propertyC, Model model) {...} 

@Override 
public int hashCode() { 
    // only calculate propertyA, propertyB, propertyC 
    ... 
} 

@Override 
public boolean equals(Object obj) { 
    // only compare propertyA, propertyB, propertyC 
    ... 
} 

@Override 
public String toString() {...} 

} 

那么首先每一个模型转换为RefModel的列表中为每个propertyA,propertyB和propertyC,然后将它们添加到一个列表,然后选择不同的人,

Collection<RefModel> refModels = selectDistinct(flatten(convert(models, (Converter<Model, List<RefModel>>)(m)->{ 
      List<RefModel> refs = new ArrayList<RefModel>(); 
      for(String a:m.getPropertyA()){ 
       for(String b:m.getPropertyB()){ 
        for(String c:m.getPropertyC()){ 
         refs.add(new RefModel(a, b, c, m)); 
        } 
       } 
      } 
      return refs; 
     }))); 
+0

谢谢你!有用! – user777