【问题标题】:how to make forEach如何制作 forEach
【发布时间】:2018-09-22 18:22:57
【问题描述】:

我有一个:

Map<String, Integer> map = new LinkedHashMap<>();       
for (String o: gamma)
   map.merge(o, 1, (a, b) -> a + b);

我需要像这样制作 forEach:

gamma.forEach(e -> map.merge(e, 1, (a, b) -> a + b));

但后来我确实收到了一条消息: 无法在数组类型 String[]

上调用 forEach(( e) -> {})

我做错了什么?如何做到这一点?

【问题讨论】:

  • 什么是gamma
  • gamma 是一个字符串数组 - String[]
  • 除了主要问题之外,您似乎想要创建某种直方图。在这种情况下,请查看Producing histogram Map for IntStream raises compile-time-error 的解决方案。在您的情况下,您可以使用Stream.of(gamma).collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); 创建Map&lt;String, Long&gt; histogram,或者如果您添加静态导入,您可以将此代码缩短为Stream.of(gamma).collect(groupingBy(identity(), counting()))

标签: java foreach


【解决方案1】:

只需使用Stream.of:Stream.of(gamma).forEach(e -&gt; map.merge(e, 1, (a, b) -&gt; a + b));

并使用Google 解决您的下一个问题!

【讨论】:

  • 可以不使用 Stream API 吗?
  • @vesnaves 你使用Arrays.asList(gamma).forEach(...),但 Stream 有什么问题?
  • 为什么要在没有Stream API 的情况下这样做? Arrays.stream 在这里也可以,但我不明白你为什么会对自己施加这样的限制。
  • @Dici 这将中断并行执行,通常这被记录为不需要的副作用。更清洁的方式是Arrays.stream(gamma).collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
  • 大多数不适合并行执行的代码将在多线程上下文中中断。我正在专门回答如何从数组创建流。否则是的,使用流时建议使用纯函数。
【解决方案2】:

这样做;

Arrays.asList(gamma).forEach(e -> map.merge(e, 1, (a, b) -> a + b));

您的 gamma 是 String 数组,在此转换为 list 到 foreach。

【讨论】:

    【解决方案3】:

    另一种方法:

    Arrays.stream(gamma).forEach(e -> map.merge(e, 1, (a, b) -> a + b));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 2020-05-23
      • 1970-01-01
      • 2023-01-03
      • 1970-01-01
      相关资源
      最近更新 更多