Java流-在一次迭代中应用两个过滤器并收集到两个集合
我有一个要迭代的映射,我想用两个条件检查entryset的值;如果满足条件1,我将其分组到一个集合中,Java流-在一次迭代中应用两个过滤器并收集到两个集合,java,dictionary,java-8,java-stream,Java,Dictionary,Java 8,Java Stream,我有一个要迭代的映射,我想用两个条件检查entryset的值;如果满足条件1,我将其分组到一个集合中,findFirst(),并获取可选项,如果不满足条件,则使用另一个条件进行筛选并收集到另一个集合,执行同样的操作 我在一次迭代中使用了for循环。现在,如果我只想用Java8流迭代一次,有可能吗 我尝试了stream().filter(cond1).map(map.Entry::getValue).findFirst()(迭代两次) 我还检查了groupingBy()和partitionBy()
findFirst()
,并获取可选项
,如果不满足条件,则使用另一个条件进行筛选并收集到另一个集合,执行同样的操作
我在一次迭代中使用了for
循环。现在,如果我只想用Java8流迭代一次,有可能吗
我尝试了stream().filter(cond1).map(map.Entry::getValue).findFirst()
(迭代两次)
我还检查了groupingBy()
和partitionBy()
,但我还没有看到这种可能性
方法1的示例:
for (Map.Entry<String, Response> entry: responses.entrySet()) {
String key = entry.getKey();
Response value = entry.getValue();
if (key.equals("foo") && !value.equals("bar")) {
res1 = value;
} else if (key.equals("some other key")) {
res2 = value;
}
}
Response finalResponse = res1 != null ? res1 : res2;
for(Map.Entry:responses.entrySet()){
String key=entry.getKey();
响应值=entry.getValue();
if(key.equals(“foo”)&&!value.equals(“bar”)){
res1=数值;
}else if(key.equals(“其他某个键”)){
res2=数值;
}
}
响应finalResponse=res1!=无效的res1:res2;
方法2的示例:
Optional<Response> res1 = Optional.empty();
Response res2;
res1 = responses.entrySet().stream()
.filter(entry -> entry.getKey().equals("foo") &&
!entry.getValue().equals("bar"))
.map(Map.Entry::getValue)
.findFirst();
res2 = responses.entrySet().stream()
.filter(entry -> entry.getKey().equals("some other key"))
.map(Map.Entry::getValue)
.findFirst().orElse(null);
Response finalResponse = res1.orElse(res2);
Optional res1=Optional.empty();
反应res2;
res1=responses.entrySet().stream()
.filter(entry->entry.getKey().equals(“foo”)&&
!entry.getValue().equals(“bar”))
.map(map.Entry::getValue)
.findFirst();
res2=responses.entrySet().stream()
.filter(entry->entry.getKey().equals(“其他某个键”))
.map(map.Entry::getValue)
.findFirst().orElse(null);
响应最终响应=res1.orElse(res2);
如果您的条件仅基于键和值的.equals()
,就像您在问题中所显示的那样,您可以使用map.get()
和一个简单的If
语句:
Response result = responses.get("foo");
if (result == null || result.equals(bar))
result = responses.get("some other key");
因此,没有必要使用其他任何东西
或者按照霍尔格的建议,您也可以使用map.getOrDefault()
:
这可能是您需要使用的:
一些见解:
if (key.equals("foo") && !value.equals("bar")) {
res1 = value;
} else if (key.equals("some other key")) {
res2 = value;
}
在循环内部,每次迭代都会不必要地检查这两个条件,尽管每个键可能只出现一次。考虑< <代码>中断>代码>用法,如<代码> RES1和<代码> RES2被设置。entry.getKey().equals(“foo”)
应缩短为map.get(“foo”)
,如果密钥不存在,则返回null
。这就是为什么我用这种行为来形容如果。。可能使用
partitioningBy
。哈哈,好吧,在这里尝试进一步了解Java流。@Naman:partitioningBy
?它在这里有什么用处?你能提供一个代码吗?我试过了,但太笨拙了。@Nikolas我最初认为这个问题应该像if/else一样阅读条件,这就是分区应该有用的地方。但在当前的上下文中,条件是独立的,因此使用分区方式
没有多大意义。尽管这个问题并不十分清楚,为什么必须遍历这里的条目集containsKey
,get
本可以为imho提供足够的信息。Response
的实例永远不能等于nullable(responses.get(“foo”)的字符串,,因为没有键foo
。是的,你是对的:)或者,您可以使用Response result=responses.getOrDefault(“foo”,bar);如果(result.equals(bar))result=responses.get(“某个其他键”)代码>@Holger是的,这是一个很好的选择。谢谢你的建议。
Response response = Optional
.ofNullable(responses.get("foo")) // find the "foo" Response
.filter(value -> !"bar".equals(value)) // except if is null or "bar"
.orElse(responses.get("other")); // then find the "other" response (then null)
if (key.equals("foo") && !value.equals("bar")) {
res1 = value;
} else if (key.equals("some other key")) {
res2 = value;
}