Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java流-在一次迭代中应用两个过滤器并收集到两个集合_Java_Dictionary_Java 8_Java Stream - Fatal编程技术网

Java流-在一次迭代中应用两个过滤器并收集到两个集合

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

我有一个要迭代的映射,我想用两个条件检查entryset的值;如果满足条件1,我将其分组到一个集合中,
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;
    }