有时,当源代码变得复杂时,我发现读取这样的语句会让人感到困惑:
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);
还有其他想法吗?
答案 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);
我为我的无知而道歉但我认为这个问题具有学术性质,而其他建议的答案可能不一定会补偿不花费额外费用,例如使用流几乎肯定会表现不佳。真正的收藏。