Java 8 Stream API中的分组依据

萨钦

我是java Stream API的新手,有一个用例来解决使用它的问题。

Map<Object, ? extends Object> map = list.stream().collect(Collectors.groupingBy(p->p.getX()
                                                            ,Collectors.groupingBy(p->p.getY()
                                                            ,Collectors.groupingBy(p->p.getZ()))));

考虑x,y和z是给定类的属性。如果我们预定义了分组顺序(首先考虑哪个属性,第二个属性,等等...),这将很好地工作。

(在给定的代码段中,属性x被认为是1st,y 2nd和z 3rd)。

现在,就我而言,分组顺序尚未预定义,并且在运行时可能会更改。因此,在编译时,我不知道在collect方法中传递什么。我正在寻找一种解决方案,通过该解决方案,我可以读取配置字符串并在运行时更改分组。

塔吉尔·瓦列夫(Tagir Valeev)

您可以创建一个帮助程序方法,该方法Collector使用给定的分类函数构建自己的方法:

@SuppressWarnings("unchecked")
@SafeVarargs
public static <T> Collector<T, ?, Map<?, ?>> multiGrouping(
                                                Function<? super T, ?>... classifiers) {
    Collector<T, ?, Map<?, ?>> result = null;
    for(int i=classifiers.length-1; i>=0; i--) {
        Collector<?, ?, ?> next;
        if(result == null) {
            next = Collectors.groupingBy(classifiers[i]);
        } else {
            next = Collectors.groupingBy(classifiers[i], result);
        }
        result = (Collector<T, ?, Map<?, ?>>)next;
    }
    return result;
}

用法示例:

Map<?, ?> map = Stream.of("abc", "def", "cd", "cfff")
                      .collect(multiGrouping(String::length, s -> s.charAt(0)));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章