Java lambda 表达式过滤器问题
Java lambda expression filter issue
我需要从哈希图中的列表中删除一些元素。老办法行得通。新方法行不通,似乎不删除请求的元素。
以旧方式登录我从未像预期的那样获得“find after!”。通过新方式,我获得了一些“追寻!” :(
旧方法:
workingMarketCards.forEach((k, v) -> {
for (FixedPriceInsertion fpi : v) {
if (fpi.getMasterId() == oc.getMasterCardId()) {
System.out.println("found before!");
}
}
ArrayList<FixedPriceInsertion> toBeRemoved = new ArrayList<>();
for (FixedPriceInsertion fpi : v) {
if (fpi.getMasterId() == (long) (oc.getMasterCardId())) {
toBeRemoved.add(fpi);
}
}
for (FixedPriceInsertion fpi : toBeRemoved) {
v.remove(fpi);
}
for (FixedPriceInsertion fpi : v) {
if (fpi.getMasterId() == oc.getMasterCardId()) {
System.out.println("found after!");
}
}
});
新方式:
workingMarketCards.forEach((k, v) -> {
for (FixedPriceInsertion fpi : v) {
if (fpi.getMasterId() == oc.getMasterCardId()) {
System.out.println("found before!");
}
}
v.stream().filter(s -> s.getMasterId() == (long) (oc.getMasterCardId()));
for (FixedPriceInsertion fpi : v) {
if (fpi.getMasterId() == oc.getMasterCardId()) {
System.out.println("found after!");
}
}
});
为什么?我的代码有什么问题?
你想要removeIf()
:
v.removeIf(s -> s.getMasterId() == (long) (oc.getMasterCardId()));
v.stream().filter()
对 v
没有任何作用;它只影响从 v
.
生成的元素流
不清楚什么类型 getMasterId()
returns,但建议使用 ==
来比较原始类型以外的东西;比较对象时总是使用 .equals()
。
过滤器不会修改变量 s
中的值。它只将过滤后的流发送到下一个链方法,因为在那之后你没有任何东西,所以它不会做任何事情。
您需要做的是使用过滤器删除值并收集它们。
ArrayList<FixedPriceInsertion> v2 = v.stream()
.filter(s -> s.getMasterId() != (long) (oc.getMasterCardId()))
.collect(Collectors.toList());
我需要从哈希图中的列表中删除一些元素。老办法行得通。新方法行不通,似乎不删除请求的元素。
以旧方式登录我从未像预期的那样获得“find after!”。通过新方式,我获得了一些“追寻!” :(
旧方法:
workingMarketCards.forEach((k, v) -> {
for (FixedPriceInsertion fpi : v) {
if (fpi.getMasterId() == oc.getMasterCardId()) {
System.out.println("found before!");
}
}
ArrayList<FixedPriceInsertion> toBeRemoved = new ArrayList<>();
for (FixedPriceInsertion fpi : v) {
if (fpi.getMasterId() == (long) (oc.getMasterCardId())) {
toBeRemoved.add(fpi);
}
}
for (FixedPriceInsertion fpi : toBeRemoved) {
v.remove(fpi);
}
for (FixedPriceInsertion fpi : v) {
if (fpi.getMasterId() == oc.getMasterCardId()) {
System.out.println("found after!");
}
}
});
新方式:
workingMarketCards.forEach((k, v) -> {
for (FixedPriceInsertion fpi : v) {
if (fpi.getMasterId() == oc.getMasterCardId()) {
System.out.println("found before!");
}
}
v.stream().filter(s -> s.getMasterId() == (long) (oc.getMasterCardId()));
for (FixedPriceInsertion fpi : v) {
if (fpi.getMasterId() == oc.getMasterCardId()) {
System.out.println("found after!");
}
}
});
为什么?我的代码有什么问题?
你想要removeIf()
:
v.removeIf(s -> s.getMasterId() == (long) (oc.getMasterCardId()));
v.stream().filter()
对 v
没有任何作用;它只影响从 v
.
不清楚什么类型 getMasterId()
returns,但建议使用 ==
来比较原始类型以外的东西;比较对象时总是使用 .equals()
。
过滤器不会修改变量 s
中的值。它只将过滤后的流发送到下一个链方法,因为在那之后你没有任何东西,所以它不会做任何事情。
您需要做的是使用过滤器删除值并收集它们。
ArrayList<FixedPriceInsertion> v2 = v.stream()
.filter(s -> s.getMasterId() != (long) (oc.getMasterCardId()))
.collect(Collectors.toList());