本文介绍了被Java8 Collectors.toMap困惑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a collection that looks like below, and I want to filter out the everything except the dates that aren't the end of the months.

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

我有以下过滤器标准。 frequency.getEnd 返回 LocalDate 匹配给定 LocalDate的月末

I have the following filter criteria. frequency.getEnd returns a LocalDate matching the end of the month for the given LocalDate.

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

所以现在我想我必须将这个过滤后的流转换回地图。而且我认为我使用收藏家来做到这一点。因此我添加:

So now I think I have to converted this filtered stream back to a map. And I think I use a collector to do that. Thus I add:

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

但我不知道如何处理 Collectors.toMap 。阅读的例子让我很困惑。这是我当前的代码,显然不起作用。

But I don't know what to do with Collectors.toMap. Reading examples leaves me confused. Here's my current code which obviously doesn't work.

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


推荐答案

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

In addition to the previous answers note that if you don't need to keep the original map, you can perform such filtering in-place without using the Stream API:

values.keySet().removeIf(k -> !frequency.getEnd(k).equals(k));

这篇关于被Java8 Collectors.toMap困惑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-30 02:19