【问题标题】:Java - Assign elements of ArrayList to array using forEach and lambdaJava - 使用 forEach 和 lambda 将 ArrayList 的元素分配给数组
【发布时间】:2020-12-07 16:02:52
【问题描述】:

我有一个 ArrayList 并想将其元素分配给一个数组。我可以使用经典的旧 java 代码来做到这一点:

List<String> list = new ArrayList<String>();
list.add("Mango");
list.add("Apple");
list.add("Banana");
list.add("Grapes");

String[] optionCode = new String[4];

// Before Java 7
System.out.println("Before Java 7:");
for (int i = 0; i < list.size(); i++) {
    optionCode[i] = list.get(i);
}

for (int i = 0; i < optionCode.length; i++) {
    System.out.println("Element " + i + " is: " + optionCode[i]);
}

现在我想使用新的 java 8 特性:forEach 和 lambda 方法:

list.stream().forEach(i -> {
    optionCode[i] = i;
    System.out.println(i);
});

它抱怨:类型不匹配:无法从 String 转换为 int 我该如何解决?

【问题讨论】:

标签: arrays lambda foreach java-8 java-stream


【解决方案1】:

您可以在这里尝试使用流toArray() 方法:

String[] optionCode = list.stream().toArray(String[]::new);
System.out.println(Arrays.toString(optionCode));

打印出来:

[Mango, Apple, Banana, Grapes]

【讨论】:

  • 附注:如果 JDK >=11,则不需要stream(),我们可以只使用list.toArray(String[]::new)。我从 Shipilev 的 shipilev.net/blog/2016/arrays-wisdom-ancients url 中阅读了一些关于 toArray() 的基准,Object [] 执行得更快。只是一个想法。
  • @prostýčlověk 新的toArray 方法的作者考虑了那篇文章的发现,所以toArray(String[]::new) 和旧的toArray(new String[0]) 一样......
【解决方案2】:

Tim Biegeleisen 已经为您的问题提出了解决方案。

但是,它不起作用的原因是您试图同时访问索引和该索引处的元素。使用forEach,您无权访问索引。


如果你真的需要在某个时候使用索引(例如,因为你想过滤掉索引n处的元素),你可以使用IntStream

IntStream.range(0, list.size())
    .filter(i -> i != n)
    .mapToObj(i -> list.get(i))   // Or mapToObj(List::get)
    .toArray(String[]::new);

【讨论】:

    【解决方案3】:

    这是不使用 forEach 的替代解决方案。

    String[] optionCode = list.toArray(n -&gt; new String[n]);

    【讨论】:

    • 您错过了 stream()。 String[] optionCode = list..stream().toArray(n -> new String[n]);
    • 没有添加 stram(),我得到编译错误:类型 List 中的方法 toArray(T[]) 不适用于参数 (( n) -> {})
    • 感谢您的指出。它在我的编译器上完美运行。现在,我发现如果没有 .stream(),它将无法在所有编译器中工作。谢谢。
    • 这不依赖于编译器。只需识别 the method you’re invoking 并在其文档中注明“Since 11”。所以它适用于 Java 11 及更高版本。顺便说一句,n -&gt; new String[n]String[]::new 相同。在较旧的 Java 版本中,您可以简单地使用 String[] optionCode = list.toArray(new String[0]);
    猜你喜欢
    • 2010-10-29
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2019-07-22
    相关资源
    最近更新 更多