Java 8 - тройное гнездо для циклов - PullRequest
4 голосов
/ 25 апреля 2020

Я написал приведенный ниже код в Java и пытаюсь преобразовать его в Java 8. Код работает, как и ожидалось, для ввода (список, созданный методом createTempList) и вывода (карта, ключом которой является 1-е десятичное число в строке, а значение - это другие десятичные знаки в строке)

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;
}

Выход:

 {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]}

Ответы [ 3 ]

2 голосов
/ 25 апреля 2020

Это, пожалуй, самый краткий способ сделать это:

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

2 голосов
/ 25 апреля 2020

После изменения ваших данных вы можете сделать это:

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;}
                                  )
                 );
1 голос
/ 25 апреля 2020

Я предлагаю вам создать еще один класс для разбора строк:

// 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())
            )
    );
}
...