如何在java中为嵌套列表编写流

时间:2016-03-07 09:43:10

标签: java java-8 java-stream

我想获取主要交易中的所有交易选项,其颜色与给定值匹配。如何编写流查询以仅获取颜色等于我的值列表中的颜色的交易选项?

我应该何时使用anyMatch,为什么我不能使用内部流过滤器?

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);

        ArrayList<String> values = new ArrayList<String>();
        values.add("red");
        values.add("blue");

        List<Deal> output
                = dl.stream()
                .filter(d -> d.getDealop().stream().anyMatch(po -> values.stream().anyMatch(v -> v.equals(po.getColor()))))
                .collect(Collectors.toList());

        System.out.println(output.size());

    }
}

1 个答案:

答案 0 :(得分:4)

在您的情况下,您希望从每笔交易中删除所有交易选项,其交易选项的颜色不在指定的颜色列表中。您可以循环交易并使用removeIf删除具有不需要颜色的交易选项。

Set<String> values = new HashSet<String>();
values.add("red");
values.add("blue");

List<Deal> output = 
        dl.stream()
          .map(d -> {
            d.getDealop().removeIf(o -> !values.contains(o.color));
            return d;
          })
          .collect(Collectors.toList());

或者,到位:

dl.forEach(d -> d.getDealop().removeIf(o -> !values.contains(o.color)));