如何使用Java 8中的Lambda表达式对嵌套流进行过滤

6

我试图根据我的“交易选项”过滤我的“交易”,但当我尝试筛选代码时,我收到一个类型不匹配的错误,即“Set<DealOptions>”无法转换为布尔值。我希望在所有交易选项都为红色时保留交易。

这是我的代码:

import java.util.*;
import java.util.stream.Collectors;

class Deal {
    String dealname;
    String dealprice;
    Set<DealOptions> dealop;

    public String getDealname() {
        return dealname;
    }

    public void setDealname(String dealname) {
        this.dealname = dealname;
    }

    public String getDealprice() {
        return dealprice;
    }

    public void setDealprice(String dealprice) {
        this.dealprice = dealprice;
    }

    public Set<DealOptions> getDealop() {
        return dealop;
    }

    public void setDealop(Set<DealOptions> dealop) {
        this.dealop = dealop;
    }

}

class DealOptions {
    String optname;
    String color;

    public String getOptname() {
        return optname;
    }

    public void setOptname(String optname) {
        this.optname = optname;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

}

public class Test {

    public static void main(String[] args) 
             {

        Deal s = new Deal();
        Set<DealOptions> ops = new HashSet<DealOptions>();
        DealOptions op = new DealOptions();
        s.setDealname("mongo");
        s.setDealprice("500");

        op = new DealOptions();
        op.setColor("red");
        op.setOptname("redop");

        ops.add(op);
        op = new DealOptions();
        op.setColor("blue");
        op.setOptname("blueop");

        ops.add(op);
        op = new DealOptions();
        op.setColor("green");
        op.setOptname("greenop");

        ops.add(op);

        s.setDealop(ops);

        List<Deal> dl = new ArrayList<Deal>();

        dl.add(s);
        ops = new HashSet<DealOptions>();
        s = new Deal();
        op = new DealOptions();
        s.setDealname("test2");
        s.setDealprice("200");

        op = new DealOptions();
        op.setColor("indigo");
        op.setOptname("indigop");

        ops.add(op);
        op = new DealOptions();
        op.setColor("violet");
        op.setOptname("violetop");

        ops.add(op);
        op = new DealOptions();
        op.setColor("orange");
        op.setOptname("orangeop");

        ops.add(op);

        s.setDealop(ops);

        dl.add(s);

        List<Deal> dev = dl.stream().filter(
                (p) -> p.getDealop().stream().filter((po) -> po.getColor().equals("red")).collect(Collectors.toSet()))
                .collect(Collectors.toList()); // error here

    }
}

错误:

无法将集合转换为布尔值

如何纠正此错误,如何根据我的交易选项筛选我的交易?

3个回答

14
你可以使用allMatch(predicate)来判断一个选项的所有交易是否都是红色的:

返回此流中的所有元素是否与提供的谓词相匹配。

在这种情况下,谓词只是告诉你一个选项是否为红色。

List<Deal> output =
    dl.stream()
      .filter(d -> d.getDealop().stream().allMatch(po -> po.getColor().equals("red")))
      .collect(Collectors.toList());

List<Deal> dd1 = dl.stream().filter(d -> d.getDealop().stream().anyMatch(p -> p.getColor().equals("red"))) .collect(Collectors.toList()); - Mam's
如果列表中包含除“红色”以外的任何其他颜色,我认为此列表将返回为空。因为它会返回false作为“返回此流的所有元素是否与提供的谓词匹配。”在这种情况下,anyMatch返回所有内容。 - Ram

1
public static Predicate<Deal> isFound(String color) {
    return p -> p.getDealop().stream().anyMatch(op->op.getColor().equals(color));
}


public static List<Deal> filterDeals (List<Deal> deals, Predicate<Deal> predicate){
        return deals.stream()
        .filter( predicate )
        .collect(Collectors.<Deal>toList());
}

//in main method add
List<Deal> dd = filterDeals(dl,isFound("red"));

0

跟进问题是:如果isFound返回true,我们是否可以返回所有匹配谓词的交易而不是单个交易?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接