【问题标题】:Java8 streams and filtersJava8 流和过滤器
【发布时间】:2016-03-08 08:25:44
【问题描述】:

我有一个集合 multimap,它存储一些针对一个月(整数)的字符串。

MonthlyCount = {1:["hello"],2:["hello","hi"]}   

我有一张地图,可以计算每月字符串的数量并添加它们。我使用 containsKey 过滤器来检查集合中是否存在键,并将它们添加到地图中。

final String[] months = new DateFormatSymbols().getShortMonths();
final Map<String, Object> metaData = new LinkedHashMap<>();
private SetMultimap<Integer, String> MonthlyCount;

for (int i = 0; i <= month; i++) {
    final int count = MonthlyCount.containsKey(i + 1) ? MonthlyCount.get(i + 1).size() : 0;
    metaData.put(months[i], count);
}

有没有办法用 Java8 的流和过滤器实现相同的行为?

【问题讨论】:

  • 您是否有理由在操作过程中访问另一张地图?什么是ticketsByMonthMap,为什么在从ticketsByMonthMap 获取密钥之前检查MonthlyCount 中是否存在密钥?
  • @Holger。感谢您指出了这一点。改了。

标签: java java-8 guava java-stream


【解决方案1】:

您可以使用IntStream 迭代所需的范围,并使用Collectors.toMap 生成所需的地图:

Map<String,Integer> map =
IntStream.range(0,months.length)
         .boxed()
         .collect(Collectors.toMap(i->months[i], 
                                   i->MonthlyCount.containsKey(i + 1) ? MonthlyCount.get(i + 1).size() : 0));

【讨论】:

  • @Tania 我认为它可能在不装箱的情况下工作,但您可以通过装箱 Stream 轻松修复它。见编辑
  • @Tania 我尝试了类似的代码并且它有效。如果您愿意,可以将 Map 的类型更改为 Map&lt;String,Object&gt;
  • @Tania 我刚刚注意到您的代码引用了两个映射 - ticketsByMonthMapMonthlyCount,但只声明了其中一个。那可能是你的问题。
  • 如果两个不同的地图名称不是故意的,使用Map.getOrDefault可以改进代码,而不是将循环转换为流,即MonthlyCount.getOrDefault(i+1, emptySet()).size()...
  • @Tania 你的意思是把它分配给一个现有的 Map 变量吗?是的。
【解决方案2】:

请注意,您正在做不必要的工作。看看SetMultimap.get:

返回与此多重映射中的key 关联的值的视图集合(如果有)。请注意,当 containsKey(key) 为 false 时,这将返回一个空集合,而不是 null

所以你在循环中需要做的就是

metaData.put(months[i], MonthlyCount.get(i + 1).size());

因为无论如何缺少键都会为零。如果您有一个非番石榴 Map&lt;…,Set&lt;…&gt;&gt;,您可以在 Java 8 中执行等效操作:

metaData.put(months[i], MonthlyCount.getOrDefault(i + 1, emptySet()).size());

其中emptySet()Collections.emptySet() 的静态导入。

当您想添加到现有的 Map 时,我不会重写循环以使用流。毕竟代码已经够简洁了

for(int i=0; i<month.length; i++)
    metaData.put(months[i], MonthlyCount.get(i + 1).size());

并且不会通过流变得更好......

【讨论】:

  • 与此用例中的集合相比,流不会提高性能吗?
  • @Tania 不,流的性能并不比非流代码好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 2023-03-23
  • 2018-08-26
相关资源
最近更新 更多