Java 8 스트림 API에서 그룹화를 수행하는 간단한 방법을 찾으려고 노력합니다.이 복잡한 방법으로 나옵니다!
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]));
귀하의 의견에 감사드립니다.
답변
나는 당신이 과부하 를 찾고 있다고 생각합니다. Collector
각 그룹마다 무엇을 해야하는지 지정 Collectors.counting()
하고 계산을 수행하기 위해 다른 것을 필요로합니다.
import java.util.*;
import java.util.stream.*;
class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("Hello");
list.add("World");
Map<String, Long> counted = list.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
System.out.println(counted);
}
}
결과:
{Hello=2, World=1}
( groupingByConcurrent
더 높은 효율성 을 위해 사용할 가능성도 있습니다. 실제 코드가 안전하다면 컨텍스트에서 염두에 두어야 할 것이 있습니다.)
답변
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));
collect.entrySet()
.forEach(e -> System.out.println(e.getKey() + " - " + e.getValue().size()));
답변
다음은 객체 목록의 예입니다.
Map<String, Long> requirementCountMap = requirements.stream().collect(Collectors.groupingBy(Requirement::getRequirementType, Collectors.counting()));
답변
현재 작업을 수행하기위한 약간 다른 옵션이 있습니다.
사용하여 toMap
:
list.stream()
.collect(Collectors.toMap(Function.identity(), e -> 1, Math::addExact));
사용하여 Map::merge
:
Map<String, Integer> accumulator = new HashMap<>();
list.forEach(s -> accumulator.merge(s, 1, Math::addExact));
답변
StreamEx 의 간단한 솔루션은 다음과 같습니다.
StreamEx.of(list).groupingBy(Function.identity(), Collectors.countingInt());
상용구 코드를 줄이십시오. collect(Collectors.
답변
타사 라이브러리를 사용하여 열려 있다면, 당신은 사용할 수 Collectors2
있는 클래스 이클립스 컬렉션을 을 변환하는 List
A가에 Bag
사용 a Stream
. A Bag
는 계산을 위해 구축 된 데이터 구조입니다 .
Bag<String> counted =
list.stream().collect(Collectors2.countBy(each -> each));
Assert.assertEquals(1, counted.occurrencesOf("World"));
Assert.assertEquals(2, counted.occurrencesOf("Hello"));
System.out.println(counted.toStringOfItemToCount());
산출:
{World=1, Hello=2}
이 특별한 경우 collect
에는 List
직접로 직접을 입력 할 수 있습니다 Bag
.
Bag<String> counted =
list.stream().collect(Collectors2.toBag());
또한 Eclipse Collections 프로토콜 Bag
을 사용 Stream
하여을 사용 하여을 사용하지 않고을 작성할 수도 있습니다 List
.
Bag<String> counted = Lists.adapt(list).countBy(each -> each);
또는이 특별한 경우 :
Bag<String> counted = Lists.adapt(list).toBag();
가방을 직접 만들 수도 있습니다.
Bag<String> counted = Bags.mutable.with("Hello", "Hello", "World");
A Bag<String>
는 Map<String, Integer>
내부적으로 키와 개수를 추적한다는 점에서 동일합니다. 그러나 Map
포함하지 않은 키 를 요청하면 키가 반환 null
됩니다. Bag
키 를 요청하면 키가 포함되어 있지 않습니다.occurrencesOf
0을 반환합니다.
참고 : 저는 Eclipse Collections의 커미터입니다.