Próbuję znaleźć prosty sposób w Java 8 stream API na grupowanie, wychodzę z tego złożonego sposobu!
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("Hello");
list.add("World");
Map<String, List<String>> collect = list.stream().collect(
Collectors.groupingBy(o -> o));
System.out.println(collect);
List<String[]> collect2 = collect
.entrySet()
.stream()
.map(e -> new String[] { e.getKey(),
String.valueOf(e.getValue().size()) })
.collect(Collectors.toList());
collect2.forEach(o -> System.out.println(o[0] + " >> " + o[1]));
Doceniam twój wkład.
java
functional-programming
java-8
Muhammad Hewedy
źródło
źródło
Odpowiedzi:
Myślę, że po prostu szukasz przeciążenia, które wymaga innego,
Collector
aby określić, co zrobić z każdą grupą ... a następnieCollectors.counting()
policzyć:Wynik:
(Istnieje również możliwość użycia w
groupingByConcurrent
celu zwiększenia wydajności. Coś, o czym należy pamiętać w przypadku prawdziwego kodu, jeśli byłoby to bezpieczne w Twoim kontekście).źródło
and then performing a reduction operation on the values associated with a given key using the specified downstream Collector
Map<String, Long> counted = list.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
, co dokładnie dzieje się w tym miejscu i wszelkie linki z dalszymi wyjaśnieniami związanymi z tematem, które można przesłaćźródło
Oto przykład listy obiektów
źródło
Oto nieco inne opcje wykonania zadania.
używając
toMap
:używając
Map::merge
:źródło
Oto proste rozwiązanie firmy StreamEx
Zmniejsz kod standardowy:
collect(Collectors.
źródło
Jeśli jesteś otwarty na korzystanie z biblioteki innej firmy, możesz użyć
Collectors2
klasy w kolekcji Eclipse, aby przekonwertowaćList
plik na plikBag
przy użyciu plikuStream
. ABag
to struktura danych stworzona do liczenia .Wynik:
W tym konkretnym przypadku można po prostu się bezpośrednio na .
collect
List
Bag
Możesz również utworzyć
Bag
plik bez użycia aStream
, dostosowując goList
za pomocą protokołów Eclipse Collections.lub w tym konkretnym przypadku:
Możesz także po prostu utworzyć torbę bezpośrednio.
A
Bag<String>
jest jak aMap<String, Integer>
, ponieważ wewnętrznie śledzi klucze i ich liczbę. Ale jeśli poprosiszMap
o klucz, którego nie zawiera, zwrócinull
. Jeśli poprosiszBag
o klucz, którego nie zawieraoccurrencesOf
, zwróci 0.Uwaga: jestem promotorem Eclipse Collections.
źródło