Strumień do Guava Multimap

0

Hejka. Tak sobie wpadłam na Google Guava - czemu nie udostępniają żadnego Collectorsa abym mogła użyć .collect() i "zakumulować" strumień w Multimap ?
Szukałam w internecie i nic nie ma. Póki co mam foreach a już wiem, że to średnie rozwiązanie w związku z tym pytam -> czy da się lepiej ;?

import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;

import java.util.Arrays;
import java.util.List;

public class MainApp {
    public static void main(String[] args) {

        Multimap<String, String> multimap = HashMultimap.create();
        List<String> lines = Arrays.asList(
                "zwierze=kot",
                "samochod=mercedes",
                "zwierze=wydra",
                "system=linux",
                "samochod=volvo",
                "zwierze=kot"
        );

        lines.stream().forEach(l -> multimap.put(l.split("=")[0], l.split("=")[1]));
        System.out.println(multimap);
    }
}

0

Guava z tego co pamiętam nie miała nigdy "reduce" w swojej implementacji.
Tylko czemu nie używasz javy 8?

0

@Shalom używam Javy8. Da się inaczej skonstruować taki silnik korzystając z Javy8 a nie z Multimap od Guava?

1
  1. http://stackoverflow.com/questions/23003542/cleanest-way-to-create-a-guava-multimap-from-a-java8-stream
  2. Albo rób collect do Map<String, Set<String>> bo przecież do tego się ta twoja multimapa sprowadzi.
0

Dobra pomyślę nad tym collectorem z SO. Odnośnie Map<String,Set<String>> owszem, ale nie potrafię już tak łatwo, ładnie tego zmapować.

2

http://www.tryjava8.com/app/snippets/54037e93e4b02cbbc2b12461

import java.util.*;
import java.util.stream.*;
 
public class MainApp {
    public static void main(String[] args) {
        List<String> lines = Arrays.asList(
                "zwierze=kot",
                "samochod=mercedes",
                "zwierze=wydra",
                "system=linux",
                "samochod=volvo",
                "zwierze=kot"
        );
        Map<String, Set<String>> multimap = lines.stream().collect(
          Collectors.toMap(v -> v.split("=")[0], 
                           v -> Collections.singleton(v.split("=")[1]),
                           (a, b) -> {
                             if (a.size() == 1) {
                               Set<String> c = new HashSet<>();
                               c.addAll(a);
                               c.addAll(b);
                               return c;
                             } else {
                               a.addAll(b);
                               return a;
                             }
                           }));
        
        System.out.println(multimap);
    }
}

{system=[linux], samochod=[mercedes, volvo], zwierze=[kot, wydra]}

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