- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Stream<String>
,我想要一个 Map<Integer, String>
.让我们调用我的分类器函数 getKey(String)
- 它可能很昂贵。有时它会返回零,这意味着该字符串应该被丢弃并且不包含在结果映射中。
所以,我可以使用这段代码:
Stream<String> stringStream;
Map<Integer, String> result =
stringStream.collect(Collectors.groupingBy(this::getKey, Collectors.joining());
result.remove(0);
这首先将不需要的字符串添加到以零为键的映射中,然后将其删除。可能有很多。有没有一种优雅的方法可以避免首先将它们添加到 map 中?
我不想在分组之前添加过滤步骤,因为那将意味着执行决策/分类代码两次。
最佳答案
您说过调用 getKey
的开销很大,但您仍然可以在过滤元素之前预先映射流中的元素。在这种情况下,对 getKey
的调用只会执行一次。
Map<Integer, String> result =
stringStream.map(s -> new SimpleEntry<>(this.getKey(s), s))
.filter(e -> e.getKey() != 0)
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, joining())));
请注意,标准 API 中没有元组类。您可以推出自己的一个或使用 AbstractMap.SimpleEntry
作为替代。
或者,如果您认为第一个版本创建了很多条目,您可以使用 collect 方法,您自己提供供应商、累加器和组合器。
Map<Integer, String> result = stringStream
.collect(HashMap::new,
(m, e) -> {
Integer key = this.getKey(e);
if(key != 0) {
m.merge(key, e, String::concat);
}
},
Map::putAll);
关于java - groupingBy 和 filter 一步到位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34748306/
有没有办法让 Word 2013 宏的 VBA 代码作为块执行,所以如果我撤消它,它不会通过它执行的各个步骤来撤消宏?我希望宏更像是内置函数。 我有将光标移动到单词末尾然后删除前三个字母的宏。如果我撤
我有一个 Stream ,我想要一个 Map .让我们调用我的分类器函数 getKey(String) - 它可能很昂贵。有时它会返回零,这意味着该字符串应该被丢弃并且不包含在结果映射中。 所以,我可
有时我需要将一个分支移动到我当前的提交。我有两种方法可以做到这一点: git checkout foo git reset --hard HEAD@{1} 我不喜欢这样,因为这样我必须更改工作目录两次
我是一名优秀的程序员,十分优秀!