使用Java 8流仅保留在多个阵列中唯一的值

时间:2016-09-18 21:24:35

标签: java arrays java-8 java-stream

我想在使用流合并它们之后,只保留两个数组的唯一值。它不是我正在寻找的distinct()函数:

int[] a = { 1, 2, 3 };
int[] b = { 3, 4, 5 };
int[] c = IntStream.concat(Arrays.stream(a), Arrays.stream(b)).distinct().toArray();

给我c = {1, 2, 3, 4, 5},但我需要c{1, 2, 4, 5}

是否有一种简单快捷的方法可以使用流来实现这一目标?

1 个答案:

答案 0 :(得分:4)

你可以这样做:

int[] a = { 1, 2, 3 };
int[] b = { 3, 4, 5 };
int[] c = IntStream.concat(Arrays.stream(a), Arrays.stream(b))
    .boxed()
    .collect(Collectors.collectingAndThen(
        Collectors.groupingBy(Function.identity(), Collectors.counting()), // Freq map
        m -> m.entrySet().stream()
            .filter(e -> e.getValue() == 1) // Filter duplicates
            .mapToInt(e -> e.getKey())
            .toArray()
    ));

首先为所有元素创建频率图,然后过滤掉多次出现的元素。