【发布时间】:2019-06-03 16:00:58
【问题描述】:
我有一个要迭代的地图,我想用两个条件检查 entryset 的值;如果满足条件1,我将它分组到一个集合中,findFirst() 并获取Optional<>,如果不满足,则使用另一个条件过滤并收集到另一个集合,执行相同操作。
我在一次迭代中使用了for 循环。现在,如果我只想用 Java 8 流迭代一次,有可能吗?
我已经尝试过stream().filter(cond1).map(Map.Entry::getValue).findFirst()(迭代两次)。
我还检查了groupingBy() 和partitionBy(),但我还没有看到这种可能性。
方法一的例子:
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;
方法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);
【问题讨论】:
-
if 或者 else .. 可能使用
partitioningBy。 -
哈哈好吧,在这里尝试加深我对Java Stream的理解..
-
@Naman:
paritioningBy?它在这里有什么用处?能给个代码吗?我试过了,但是太笨拙了。 -
@Nikolas 我最初认为问题读取条件为 if/else,这就是分区有用的地方。但在当前情况下,条件是独立的,因此使用
partitioningBy没有多大意义。尽管就为什么必须遍历此处设置的条目而言,这个问题并不是很清楚。containsKey、get可以提供足够的信息恕我直言。 -
Response的实例永远不能等于字符串"bar"。
标签: java dictionary java-8 java-stream