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

标签 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());

    }
}

最佳答案

在您的情况下,您希望从每个交易中删除其颜色不在指定颜色列表中的所有交易选项。您可以循环查看您的交易并使用 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)));

关于java - 如何在java中为嵌套列表编写流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35840426/

相关文章:

java - 如何使用 Java API 重命名 OIM 帐户?

java - 如何将 Apache Drill 选项配置为环境变量?

java - 为什么 Collections.sort (dateList,Collections.reverseOrder()) 会抛出 NPE

java - Lambda 表达式中方法引用的方法引用

java - java中Stream API中 "filter()"方法的性能

Java 流操作调用

java - 从 rich :datatable binding table 获取行

java - 如何在重新加载类后保留变量值

java - 什么是 sjavac,它适用于谁以及如何使用它?

Java 8 : Getting a property from a List of a List