如何分组java
分组Java的方法
在Java中,分组通常指将集合中的元素按照某种规则分类。可以使用Java 8引入的Stream API和Collectors.groupingBy方法来实现分组操作。
使用Stream API分组
利用Stream的groupingBy方法可以轻松实现分组。以下是一个示例代码:
List<String> items = Arrays.asList("apple", "banana", "apple", "orange", "banana", "apple");
Map<String, List<String>> groupedItems = items.stream()
.collect(Collectors.groupingBy(Function.identity()));
System.out.println(groupedItems);
这段代码会将列表中的字符串按照其值分组,输出结果为:
{
"orange": ["orange"],
"banana": ["banana", "banana"],
"apple": ["apple", "apple", "apple"]
}
按条件分组
可以根据自定义条件进行分组。例如,按字符串长度分组:

Map<Integer, List<String>> groupedByLength = items.stream()
.collect(Collectors.groupingBy(String::length));
System.out.println(groupedByLength);
输出结果可能为:
{
5: ["apple", "apple", "apple"],
6: ["banana", "banana", "orange"]
}
多级分组
支持嵌套分组,例如先按长度再按首字母分组:
Map<Integer, Map<Character, List<String>>> multiGrouped = items.stream()
.collect(Collectors.groupingBy(
String::length,
Collectors.groupingBy(s -> s.charAt(0))
));
System.out.println(multiGrouped);
分组后计数
可以对分组后的元素进行计数:

Map<String, Long> countByItem = items.stream()
.collect(Collectors.groupingBy(
Function.identity(),
Collectors.counting()
));
System.out.println(countByItem);
输出结果为:
{
"orange": 1,
"banana": 2,
"apple": 3
}
分组并转换结果
可以在分组后对结果进行转换,例如获取每组中的最大值:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
Map<Boolean, Optional<Integer>> partitioned = numbers.stream()
.collect(Collectors.groupingBy(
n -> n % 2 == 0,
Collectors.maxBy(Comparator.naturalOrder())
));
System.out.println(partitioned);
并行流分组
对于大数据集,可以使用并行流提高分组效率:
Map<String, List<String>> parallelGrouped = items.parallelStream()
.collect(Collectors.groupingByConcurrent(Function.identity()));
System.out.println(parallelGrouped);






