将列表中的对象分组为java 8

时间:2016-08-30 05:41:27

标签: java lambda java-8

我有一个列表:lst = {"a","b","c","b","c","a","c","a","b"}

我想把它分成几块:

像第一个块一样:a,b,c 第二个是:b,c,a 第三是:c,a,b

请注意这些块可以是任何顺序,不是简单的String对象,但可以是任何东西(Viz:Complex对象,Map等)。

此外,我不能盲目地分成块,因为每个块中的数据应该是相同的并且它是相关的数据,即:在第一个块a,b,c中是相互关联的。在第二个块b中,c,a是相互关联的,因此上。

我该怎么做。

我想到的一种可能方式是在Java8中使用收集器和组。

任何建议。

PS:请忽略语法,这只是为了理解目的。

注意:此处标记为重复的答案不适用。

1 个答案:

答案 0 :(得分:1)

如果没有一些中间映射对象,我没有看到这样做的可能性。只是尝试一下,我提出了以下解决方案:

public class Try30 {
    public static class StringIntPair {
        public final int i;
        public final String s;
        public StringIntPair(int i, String s) {
            this.i = i;
            this.s = s;
        }
    }

    public static void main(String[] args) {
        List<String> in = Arrays.asList("a","b","c","b","c","a","c","a","b");
        AtomicInteger cnt = new AtomicInteger(0);
        Map<Integer, List<String>> res = in.stream()
            .map(s -> new StringIntPair(cnt.getAndIncrement(), s))
            .collect(Collectors.groupingBy(
                p -> p.i / 3,
                Collectors.mapping(p -> p.s, Collectors.toList())
                ));
        System.out.println(res);
    }
}

然而,在现实生活中,我宁愿选择经典的循环方法,因为这看起来完全令人费解并且非常难以理解。请不要忘记,即使在Java 8 for循环和while循环中,它仍然是支持且有价值的语言功能。