相关疑难解决方法(0)

Java Lambda Stream Distinct()在任意键上?

我经常遇到Java lambda表达式的问题,当我想在对象的任意属性或方法上使用distinct()一个流时,但想要保留对象而不是将其映射到该属性或方法.我开始创建这里讨论的容器,但我开始做足够的事情,它变得烦人,并制作了很多样板类.

我将这个Pairing类放在一起,该类包含两个类型的两个对象,并允许您指定左,右或两个对象的键控.我的问题是......对于某些类型的关键供应商,distinct()是否真的没有内置的lambda流功能?那真让我感到惊讶.如果没有,该课程能否可靠地完成该功能?

以下是它的调用方式

BigDecimal totalShare = orders.stream().map(c -> Pairing.keyLeft(c.getCompany().getId(), c.getShare())).distinct().map(Pairing::getRightItem).reduce(BigDecimal.ZERO, (x,y) -> x.add(y));
Run Code Online (Sandbox Code Playgroud)

这是配对课程

    public final class Pairing<X,Y>  {
           private final X item1;
           private final Y item2;
           private final KeySetup keySetup;

           private static enum KeySetup {LEFT,RIGHT,BOTH};

           private Pairing(X item1, Y item2, KeySetup keySetup) {
                  this.item1 = item1;
                  this.item2 = item2;
                  this.keySetup = keySetup;
           }
           public X getLeftItem() { 
                  return item1;
           }
           public Y getRightItem() { 
                  return item2;
           }

           public static <X,Y> Pairing<X,Y> keyLeft(X item1, Y item2) { …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

60
推荐指数
6
解决办法
5万
查看次数

优雅地组合两个列表的元素,使它们在某个属性值中是唯一的?

假设我有这个Java 8代码:

public class Foo {
    private long id;
    public getId() {
        return id;
    }

    //--snip--
}


//Somewhere else...

List<Foo> listA = getListA();
List<Foo> listB = getListB();

List<Foo> uniqueFoos = ???;
Run Code Online (Sandbox Code Playgroud)

List<Foo> uniqueFoos我要添加的所有元素listA,并listB因此所有FooS ^具有唯一的ID.也就是说,如果已经有一个FoouniqueFoos具有特定ID不添加其他Foo具有相同ID但跳过它来代替.

当然有简单的旧迭代,但我认为应该有更优雅的东西(可能涉及流,但不是强制性的),但我无法弄清楚...

我可以想到一个好的解决方案,涉及equals()基本上覆盖方法return id == other.id;并使用Setdistinct().不幸的是我无法覆盖,equals()因为对象相等不能改变.

实现这一目标的清晰有效方法是什么?

java java-8

3
推荐指数
1
解决办法
90
查看次数

标签 统计

java ×2

java-8 ×2

lambda ×1