private static void recursive (List<ProductSpecDetail> specDetailList, List<String> result, int layer, StringBuilder curList) { List<List<String>> dimValue = new ArrayList<>(); for (ProductSpecDetail detail : specDetailList) { Set<ProductSpecDetailValue> values = detail.getValues(); List<String> di = new ArrayList<>(); for (ProductSpecDetailValue value : values) { StringBuilder sb1 = new StringBuilder(); sb1.append(value.getSpecId()).append(":").append(value.getSpecValueId()); di.add(sb1.toString()); } dimValue.add(di); } if (layer < dimValue.size() - 1) { if (dimValue.get(layer).size() == 0) { recursive(specDetailList, result, layer + 1, curList); } else { for (int i = 0; i < dimValue.get(layer).size(); i++) { StringBuilder list = curList; list = new StringBuilder().append(list).append(";").append(dimValue.get(layer).get(i)); recursive(specDetailList, result, layer + 1, list); } } } else if (layer == dimValue.size() - 1) { if (dimValue.get(layer).size() == 0) { result.add(curList.toString()); } else { for (int i = 0; i < dimValue.get(layer).size(); i++) { StringBuilder list = curList; list = new StringBuilder().append(list).append(";").append(dimValue.get(layer).get(i)); list.deleteCharAt(0); result.add(list.toString()); } } } }