Iterator<Rate> rateIt = rates.iterator();
int lastRateOBP = 0;
while (rateIt.hasNext())
{
Rate rate = rateIt.next();
int currentOBP = rate.getPersonCount();
if (currentOBP == lastRateOBP)
{
rateIt.remove();
continue;
}
lastRateOBP = currentOBP;
}
如何使用java 8的stream
上面的代码转换为lambda?例如list.stream()。filter().....但我需要操作列表。
答案 0 :(得分:4)
最简单的解决方案是
Set<Integer> seen = new HashSet<>();
rates.removeIf(rate -> !seen.add(rate.getPersonCount()));
它利用Set.add
如果值已经在false
中,即已经遇到Set
将返回Rate
的事实。由于这些是你想要删除的元素,所以你要做的就是否定它。
如果为具有相同人数的每个组保留一个任意Iterator
实例就足够了,此解决方案不需要排序。
与原始基于Collection
的解决方案一样,它依赖于原始 SELECT Candidate.Name, Max(Vote.NumberOfvote)
FROM Vote INNER JOIN Candidate
ON Vote.CandidateID = Candidate.Id
GROUP BY Candidate.Name
的可变性。
答案 1 :(得分:2)
如果确实希望与您在评论中所说的不同并进行排序,那么它就像以下一样简单:
TreeSet<Rate> sorted = rates.stream()
.collect(Collectors.toCollection(() ->
new TreeSet<>(Comparator.comparing(Rate::getPersonCount))));
但是请注意,在你的迭代器示例中,你不是删除重复项,而只是删除连续的重复项(我在你的问题的评论中举例说明了这一点)。
修改强>
您似乎想要distinct
Function
;或者用简单的词语表示personCount
需要不同的元素,但如果发生冲突,你想要max pos
。
在jdk中,尚未这样的东西。但可能是,请参阅this。
由于您希望按键对它们进行排序和区分,我们可以通过以下方式模拟它:
Collection<Rate> sorted = rates.stream()
.collect(Collectors.toMap(Rate::getPersonCount,
Function.identity(),
(left, right) -> {
return left.getLos() > right.getLos() ? left : right;
},
TreeMap::new))
.values();
System.out.println(sorted);
另一方面,如果你绝对需要来返回TreeSet
来实际上表示这是唯一元素并已排序:
TreeSet<Rate> sorted = rates.stream()
.collect(Collectors.collectingAndThen(
Collectors.toMap(Rate::getPersonCount,
Function.identity(),
(left, right) -> {
return left.getLos() > right.getLos() ? left : right;
},
TreeMap::new),
map -> {
TreeSet<Rate> set = new TreeSet<>(Comparator.comparing(Rate::getPersonCount));
set.addAll(map.values());
return set;
}));
答案 2 :(得分:1)
如果您的Rate
类型具有自然排序(即实现Comparable
),这应该有效:
List<Rate> l = rates.stream()
.distinct()
.sorted()
.collect(Collectors.toList());
如果没有,请使用lambda作为自定义比较器:
List<Rate> l = rates.stream()
.distinct()
.sorted( (r1,r2) -> ...some code to compare two rates... )
.collect(Collectors.toList());
如果您只是需要删除重复项,则可以删除对sorted
的调用。