[英]Java 8 - triple nested for loops
我在 Java 中編寫了以下代碼,並嘗試將其轉換為 Java 8. 代碼對輸入(由 createTempList 方法創建的列表)和輸出(一個 Z1D78DC8ED51214E518B5114 的十進制字符串和值 key 為是字符串的其他小數)
public static void main(String[] args) {
List<String> tempList = createTempList();
createMap8(tempList);
}
public static Map<String,List<String>> createMap8(final List<String> tempList) {
Map<String,List<String>> vlanFoos = new HashMap<String,List<String>>();
for(int i=0; i< tempList.size(); i++) {
String[] idsI = tempList.get(i).split("\\.");
String vlanI = idsI[0];
List<String> fooList = new ArrayList<String>();
for(int j = 0 ; j < tempList.size() ; j ++) {
String foo = "";
String[] idsJ = tempList.get(j).split("\\.");
String vlanJ = idsJ[0];
if(vlanI.equals(vlanJ)) {
for(int k = 1; k < idsJ.length; k++) {
foo = foo + idsJ[k];
if(idsJ.length - k != 1) {
foo = foo + ".";
}
}
}
if(!foo.isEmpty()) {
fooList.add(foo);
}
}
vlanFoos.put(vlanI, fooList);
}
return vlanFoos;
}
輸入:
private static List<String> createTempList() {
List<String> tempList = new ArrayList<String>();
tempList.add("1.24.75.13.45.91.0");
tempList.add("1.88.213.110.66.182.127");
tempList.add("1579.204.45.224.38.12.161");
tempList.add("1580.204.45.224.38.12.161");
tempList.add("21.204.45.224.38.12.161");
tempList.add("39.204.45.224.38.12.161");
tempList.add("5.12.244.213.2.178.192");
tempList.add("5.204.45.224.38.12.161");
tempList.add("5.212.202.109.116.154.217");
tempList.add("5.212.202.109.116.154.218");
tempList.add("5.40.153.58.148.24.67");
tempList.add("5.76.177.205.33.164.80");
tempList.add("5.84.236.47.13.223.64");
tempList.add("5.88.213.110.66.182.128");
return tempList;
}
Output:
{1=[24.75.13.45.91.0, 88.213.110.66.182.127],
1579=[204.45.224.38.12.161],
5=[12.244.213.2.178.192, 204.45.224.38.12.161, 212.202.109.116.154.217, 212.202.109.116.154.218, 40.153.58.148.24.67, 76.177.205.33.164.80, 84.236.47.13.223.64, 88.213.110.66.182.128],
39=[204.45.224.38.12.161],
1580=[204.45.224.38.12.161],
21=[204.45.224.38.12.161]}
這可能是最簡潔的方法:
public static Map<String, List<String>> createMap8(final List <String> tempList) {
return tempList.stream()
.map(s -> s.split("\\.", 2))
.collect(groupingBy(p -> p[0], mapping(a -> a[1], toList())));
}
對於 createTempList 方法,您可以只使用 Arrays.asList
修改數據后,您可以執行以下操作:
Map<String, List<String>> map = tempList.stream()
.map(t -> t.split("\\.", 2))
.collect(Collectors.toMap(a -> a[0], v -> new ArrayList<>(singletonList(v[1])),
(l1, l2) -> {l1.addAll(l2); return l1;}
)
);
我建議您創建另一個 class 來進行字符串解析:
// please give this a better name!
// I don't know what the numbers mean, but you should!
class MyObject {
private String key;
private String value;
public String getKey() {
return key;
}
public String getValue() {
return value;
}
public MyObject(String s) {
// here I split the string into the first and the rest
String[] parts = s.split("\\.", 2);
key = parts[0];
value = parts[1];
}
}
然后使用流,可以像這樣進行分組:
public static Map<String,List<String>> createMap8(final List<String> tempList) {
return tempList.stream().map(MyObject::new).collect(
Collectors.groupingBy(
MyObject::getKey, Collectors.mapping(MyObject::getValue, Collectors.toList())
)
);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.