java.lang.IllegalStateException: Duplicate key . Java8

0

hejka. mam taki plik:

klucz=abc
kluca=def
kluca=ghi
klucb=jkl
    public void test(String filename) {
        Map<String, String> map = new HashMap<>();
        try (Stream<String> lines = Files.lines(Paths.get(filename))) {
            map = lines.collect(Collectors.toMap(l -> l.split("=")[0], l -> l.split("=")[1]));
        } catch (IOException io) {
            io.printStackTrace();
        }
        System.out.println(map);
    }

dostaję java.lang.IllegalStateException: Duplicate key def.
normalnie map.put("kluca","ghi") podmienia starą wartość na nową tak? ale tutaj to inna akcja. jak najkrócej wrzucić ten plik do hashmapy z aktualizacją wartości ( tak jak standardowo działa map.put()

1

Jest metoda Collectors.toMap przyjmująca trzy parametry, z czego ostatni to funkcja rozwiązująca konflikty.

1

(pisane z palca!)

lines.forEach(line -> map.put(line.split("=")[0], line.split("=")[1]);

O to ci chodzi? Brzydkie toto bo nie funkcyjne i operujesz na efektach ubocznych, ale powinno zadziałac ;)

0

@Wibowit no właśnie nigdzie nie mogę znaleźć nawet przykładu jak ta funkcja miałaby wyglądać.

@Shalom tak działa. Jakbyś miał czas; o co chodzi z tymi efektami ubocznymi i jakbyś to ładniej zrobił?

1

@karolinaa
Moim zdaniem funkcja wyglądałaby mniej więcej tak: (a, b) -> a, ewentualnie (a, b) -> b.

0

DZIENAA!!!!! ^_^

0

A nie mozesz uzyc normalnego jezyka? Problem sam sie wtedy rozwiaze.

val map = Source.fromFile("data.txt").getLines().toList.map { input =>
  val split = input.split("=")
  (split(0), split(1))
}.toMap
0

@_tmp taa może kiedyś zerknę. póki co java mi starczy. scala za trudna dla D playerki ;b

1

@karolinaa generalnie chodzi o to, że w programowaniu funkcyjnym podstawową operacją jest transformacja danych ze strumienia źródłowego w strumień wynikowy (zwykle za pomocą map, filter i reduce). Efekt uboczny to jest sytuacja kiedy twój kod w trakcie ewaluacji wyrażenia dokonuje jakichś zewnętrznych manipulacji (nie związanych z transformacją danych). W kodzie który podałem masz w trakcie ewaluacji dodwanie elementów do zewnętrznej kolekcji, czyli właśnie efekt uboczny, bo to jest operacja zupełnie nie związana z transformacją danych która tam zachodzi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1