中间结果的变量初始化

时间:2017-05-03 14:55:31

标签: java

有时,当源代码变得复杂时,我发现读取这样的语句会让人感到困惑:

Set<Integer> odds = new HashSet<>(ints); // not yet true
odds.removeAll(evens); // now it's true

我想知道是否有一种聪明的方法来避免odds包含偶数值的行。类似的东西:

(Set<Integer> odds = new HashSet<>(ints)).removeAll(evens); // doesn't compile

我可以使用双括号初始化,

Set<Integer> odds = new HashSet<Integer>(ints) {{ removeAll(evens); }};

但这显然很糟糕for multiple reasons

这是编译的另一个示例 hack,但它看起来更像是一个笑话:

Set<Integer> odds = (odds = new HashSet<>(ints)).retainAll(evens) ? odds : odds

我想到的最后一个(写这篇文章时)似乎没问题,虽然它使用了两行:

Set<Integer> odds;
(odds = new HashSet<Integer>(ints)).removeAll(evens);

还有其他想法吗?

2 个答案:

答案 0 :(得分:3)

使用流:

Set<Integer> odds =
    ints.stream().filter(x -> x % 2 == 1).collect(Collectors.toSet());

如果你想同时将集合划分为赔率和平均值:

Map<Boolean, Set<Integer>> oddsAndEvens =
    ints.stream().collect(
        Collectors.partitioningBy(x -> x % 2 == 0, Collectors.toSet()));
Set<Integer> evens = oddsAndEvens.get(true);
Set<Integer> odds = oddsAndEvens.get(false);

答案 1 :(得分:-2)

我不确定你为什么要试图使问题复杂化。如果您可以获取evens的集合,则可以对odds执行相同的操作。

然后你就可以做到:

Set<Integer> oddsSet = new HashSet<>(odds);

或者,您可以将最后一个示例压缩到一行:

Set<Integer> odds; (odds = new HashSet<Integer>(ints)).removeAll(evens);

我为我的无知而道歉但我认为这个问题具有学术性质,而其他建议的答案可能不一定会补偿不花费额外费用,例如使用流几乎肯定会表现不佳。真正的收藏。