在Java 8中,Stream
API的groupingBy
方法用于根据指定的分类函数对流中的元素进行分组。如果你想在分组时使用当前项(即流中的每个元素本身),你可以直接将元素作为分类函数的参数传递给groupingBy
。
以下是一个简单的示例,展示了如何在groupingBy
中使用当前项:
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class GroupingByExample {
public static void main(String[] args) {
List<String> items = Arrays.asList("apple", "banana", "apple", "orange", "banana", "banana");
// 使用当前项(即字符串本身)作为分组的键
Map<String, List<String>> groupedItems = items.stream()
.collect(Collectors.groupingBy(item -> item));
// 输出分组结果
groupedItems.forEach((key, value) -> System.out.println(key + ": " + value));
}
}
在这个示例中,我们有一个包含水果名称的字符串列表。我们使用stream()
方法创建一个流,然后使用groupingBy
方法根据每个字符串本身(即当前项)进行分组。最后,我们将分组结果存储在一个Map
中,并输出每个分组及其对应的元素列表。
优势:
类型与应用场景:
Comparable
接口或具有合适hashCode()
和equals()
方法的类型。可能遇到的问题及解决方法:
parallelStream()
)来提高处理速度,或者使用更高效的数据结构来存储分组结果。groupingBy
时需要特别注意,因为null值可能会导致空指针异常。为了避免这个问题,可以在分组函数中添加一个null检查,或者使用filter()
方法先过滤掉null值。例如,如果我们要对可能包含null值的字符串列表进行分组,可以这样做:
Map<String, List<String>> groupedItems = items.stream()
.filter(Objects::nonNull) // 先过滤掉null值
.collect(Collectors.groupingBy(item -> item));
这样就可以避免在分组过程中出现空指针异常了。
领取专属 10元无门槛券
手把手带您无忧上云