当前位置: 首页 > 知识库问答 >
问题:

被Java8Collectors.toMap

冀萧迟
2023-03-14

我有一个如下所示的集合,我想过滤掉除了不是月末的日期之外的所有内容。

2010-01-01=2100.00, 
2010-01-31=2108.74, 
2010-02-01=2208.74, 
2010-02-28=2217.92, 
2010-03-01=2317.92, 
2010-03-31=2327.57, 
2010-04-01=2427.57, 
2010-04-30=2437.67, 
2010-05-01=2537.67, 
2010-05-31=2548.22, 
2010-06-01=2648.22, 
2010-06-30=2659.24, 
2010-07-01=2759.24, 
2010-07-31=2770.72, 
2010-08-01=2870.72, 
2010-08-31=2882.66, 
2010-09-01=2982.66, 
2010-09-30=2995.07, 
2010-10-01=3095.07, 
2010-10-31=3107.94, 
2010-11-01=3207.94, 
2010-11-30=3221.29

我有以下筛选条件<代码>频率。getEnd返回与给定LocalDate月底匹配的本地日期。

.filter(p -> frequency.getEnd(p.getKey()) == p.getKey())

所以现在我想我必须将过滤后的数据流转换回地图。我想我用一个收集器来做这件事。因此我补充说:

.collect(Collectors.toMap(/* HUH? */));

但我不知道该怎么处理收藏家。阅读示例让我感到困惑。这是我目前的代码,显然不起作用。

TreeMap<LocalDate, BigDecimal> values = values.entrySet()
                                              .stream()
                                              .filter(p -> frequency.getEnd(p.getKey()) == p.getKey())
                                              .collect(Collectors.toMap(/* HUH? */));

共有3个答案

万俟穆冉
2023-03-14
匿名用户

因为您正在迭代< code>Map。Entry值,而< code>toMap()只需要两个方法来提取键和值,就这么简单:

Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)

请注意,这不会返回树状图。为此,您需要:

Collectors.toMap(Entry::getKey,
                 Entry::getValue,
                 (v1,v2) -> { throw new IllegalStateException("Duplicate key"); },
                 TreeMap::new)

诸葛乐逸
2023-03-14

除了前面的答案之外,请注意,如果您不需要保留原始地图,您可以在不使用Stream API的情况下就地执行此类过滤:

values.keySet().removeIf(k -> !frequency.getEnd(k).equals(k));
舒永嘉
2023-03-14
匿名用户

考虑你的问题是这样的:你有一个地图入口流,也就是说一个

所以,你是对的,你应该使用Collectors.toMap。现在,正如你在留档中看到的,实际上有3个Collectors.toMap,具体取决于参数:

  • toMap(keyMapper,valueMapper)keyMapper是一个函数,其输入是流当前元素,其输出是最终Map的键。因此,它将Stream元素映射到一个键(即名称)valueMapper是一个函数,其输入是流当前元素,输出是最终Map的值
  • toMap(keyMapper、valueMapper、mergeFunction)。前两个参数与之前相同。第三个函数mergeFunction是在最终Map中出现重复的关键元素时调用的函数;因此,它的输入是2个值(即keyMapper为其返回相同键的两个值),并将这两个值合并为一个值
  • toMap(keyMapper、valueMapper、mergeFunction、mapSupplier)。前三个参数与之前相同。第四个是Map的供应商:正如它目前在JDK中实现的那样,前面的两个toMap返回一个 HashMap 实例。但如果您想要一个特定的Map实例,该供应商将返回该实例

在我们的具体例子中,我们需要使用第三个< code>toMap,因为我们希望结果映射显式地是一个< code>TreeMap。让我们看看我们应该给它什么输入:

  • keyMapper:所以这应该返回最终Map的键。在这里,我们正在处理一个Stream

最终代码,我刚刚编写了 Stream 的收集部分(请注意,在此代码中,您还可以使用相应的方法引用,如上所述,我在注释中添加了它们):

Collectors.toMap(
       e -> e.getKey(),    // Map.Entry::getKey
       e -> e.getValue(),  // Map.Entry::getValue
       (v1, v2) -> { throw new IllegalStateException(); },
       () -> new TreeMap<>())  // TreeMap::new
)

 类似资料:
  • 大家都知道英文中be动词+过去分词的组合,表示的是被动的意思,所以翻译时也多直接表达为“被xx”。一般情况下这样没有大问题,但我们再三说过,“条件反射式”的翻译,是翻译中的大忌。被动语态的处理也是如此,遇到被动语态就翻译为“被xx”,就会生出许多别扭,不信可以看下面几个句子: 我被邀请来参加这台晚会 这件事情被登上了报纸 此事被讨论之后 他被命令去执行任务 这本书被许多人高度评价 在这几个句子中,

  • 我是写测试和使用Mockito的新手。我在Stackoverflow上阅读了类似的主题,并做了建议的更改,确保所考虑的类/接口/方法是开放的。 我试图跟踪这个 模仿构造函数注入的依赖项 这是我目前想出来的测试 但我一直得到的回应是 即使我在测试中没有提到这种方法,我也得到了这种反应。这是我的演示者注册方法。我已经改变了类/接口 同样地 这里是接口 感谢您的帮助。

  • 重庆一小公司  面试  JAVA  本科应届  51分钟。 0八股文  一开始挺正常 后面就不了。 基本是一些场景题目 sql 1.id  name   age  查找姓陈开始的名字,看着题目挺简单的吧。回答完整sql就行。 因为是口头回答 有点像伪代码  我说 select  id name  age   from 表明 然后通过like  陈% 面试官说 有两个细节  where 关键字 没说

  • 注意:我已经遵循了这个教程并测试了他们的应用程序,但它仍然不能工作。服务在一段时间后被取消。 基本上,我的目标是实现一个可以在后台运行的服务(即使当应用程序关闭时),并每分钟获得位置更新。

  • 问题很简单 在这里打破头! 编辑:一个小突破。我打印了目标,它返回的是SimpleJPrepository,而不是实际的存储库。

  • 我有一个骆驼路线如下。虽然我设置了处理(true),但我不明白为什么defaul在所有重试都耗尽后,defaul的处理程序会调用的。 日志: 20.04.03 11:46:53.907 INFO ad #6 - timer://testRoute route1 面包屑 Id=ID-xxxxxx-1585894556662-0-4 |世界您好 20.04.03 11:46:53.913错误广告#6-