如何将forEach转换为lambda

时间:2017-05-15 07:22:36

标签: java-8 java-stream

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().....但我需要操作列表。

3 个答案:

答案 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的调用。