我想获取主要交易中的所有交易选项,其颜色与给定值匹配。如何编写流查询以仅获取颜色等于我的值列表中的颜色的交易选项?
我应该何时使用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());
}
}
答案 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)));