【问题标题】:Convert a String of bits into an array of enums using java 8 streams使用 java 8 流将位字符串转换为枚举数组
【发布时间】:2020-04-08 16:52:17
【问题描述】:

我有一串空格分隔的位(1 和 0),我想将其转换为枚举数组。以下是我迄今为止的努力。

这是枚举类

enum Color { RED, GREEN }

这是转换代码。

Color[] colors = (Color[]) Arrays.stream(sc.nextLine().split("\\s"))
    .map(i -> {
         if (i.equals("0")) return Color.RED;
         else return Color.GREEN;
    })
    .toArray();

这段代码我面临以下问题:

  1. 它使用类型转换从Objects 数组更改为Colors 数组,这可能会产生运行时错误。如果没有类型转换,我会非常喜欢。

  2. 地图功能。我在 mapToObj 上的 StackOverflow 上进行了搜索,看看是否有一种方法可以指定地图的返回类型。我认为当您指定地图应返回 Color 对象时更安全。

【问题讨论】:

  • 非常有趣!如何指定它是 0 或 1
  • 如何指定什么是0还是1?
  • 是的。我如何告诉 Color 它是哪一个
  • 用你的地图功能,就像你现在做的那样?
  • 像这样:map(i -> i.toArray[i]) ?

标签: java generics java-8 enums java-stream


【解决方案1】:

为避免强制转换,请将参数传递给toArray

.toArray(Color[]::new)

这是唯一需要的更改。

不需要为 map 函数指定返回类型。您只返回 Color 的实例这一事实意味着它的返回类型是 Color

【讨论】:

  • 我认为你应该保留关于 polyexpression 的部分。这很迷人。和令人兴奋的
  • @GilbertS 但实际上并不正确。方法调用不是多表达式。 lambda 和方法引用是,而不是 Stream.map(...) 本身。
  • 好吧,你刚才说的我没看懂,不过我会多研究的。我知道方法引用如下所示:Color[]::new。但我仍然无法弄清楚的一件事是为什么你说我应该使用:.toArray(new Color[0])。 Color[] 数组中的 0 是什么。总是 0 吗?
  • @GilbertS 我将 API 与 Collections.toArray 混淆了,它采用数组而不是方法引用来构造数组的新实例。零的原因有些复杂(例如,您可以传入一个预先确定大小的数组),但当前的“最佳实践”是使用零。
  • 哦!规模。明白了。虽然它在实践中不起作用。 IDE 说:reason: no instance(s) of type variable(s) A exist so that Color[] conforms to IntFunction<A[]>
【解决方案2】:

这是要走的路:

Color[] colors = Arrays.stream(sc.nextLine().split("\\s"))
    .map(i -> i.equals("0") ? Color.RED : Color.GREEN)
    .toArray(Color[]::new);

如果要将Stream转换为对象数组,则需要使用Stream::toArray(IntFunction)方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-27
    • 2021-04-11
    • 2012-11-05
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多