Java 8 lambda : Can I generate a new ArrayList of objects from an IntStream?

标签 java lambda java-8

我有一个卡片类

public class Card {

   private int value, suit;

   public Card(int value, int suit) {
       this.value = value;
       this.suit = suit;
   }

   //gets, sets, toString
}

这是我通常填充 Card 的 ArrayList 的方式

for(int suit = 1; suit <= 4; ++suit)
    for(int value = 1; value <= 13; ++value)
        Cards.add(new Card(value, suit));

但是我想用一个Lambda表达式来初始化它

ArrayList<Card> Cards = IntStream.range(1, 4)
                           .map(value -> IntStream.range(1, 13)
                               .map(suit -> new Card(value, suit)));

Intellij 在 .map(suit -> new Card(suit, value)) 下给我一个错误

它说“lambda 表达式中不兼容的返回类型 Card”

最佳答案

这就是你想要的:

List<Card> cards = IntStream.rangeClosed(1, 4)
    .boxed()
    .flatMap(value -> 
        IntStream.rangeClosed(1, 13)
            .mapToObj(suit -> new Card(value, suit))
    )
    .collect(Collectors.toList());

注意事项:

  • 您必须将整数装箱,因为基元上的 flatMap 没有任何 类型转换重载,如 flatMapToObj(不存在);

  • 分配给 List 而不是 ArrayList 因为 Collectors 方法没有 保证它们返回的具体类型(碰巧目前是 ArrayList,但你不能依赖它);

  • 在这种情况下使用rangeClosed

关于Java 8 lambda : Can I generate a new ArrayList of objects from an IntStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22649978/

相关文章:

java - 是否可以增加 Google Cloud Datastore 请求的超时时间?

java - 使用流而不是嵌套的 for 循环

实现 toFindResult() 的 Java Matcher 类

java - 在多个数据存储属性上使用不等式过滤器进行对象化/数据存储查询

java - 我在哪里可以找到 SolarFlare OpenOnLoad Kernel Bypass 的一些示例 Java 代码?

c++ - 调用可访问类成员的成员函数的 Lambda 函数

python - dask 中的奇怪行为适用于 lambda 函数循环

maven - 错误 : lambda expressions are not supported in -source 1. 5 使用 java 8 运行

java - 如何将函数列表应用于 Java 8 中的值?

java - 如果必要的应用程序不存在,则重定向到 google playstore