Java8Lambda:我可以从IntStream生成对象的新ArrayList吗?

Java8Lambda:我可以从IntStream生成对象的新ArrayList吗?,java,lambda,java-8,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 } 这是我通常填写卡片列表的方式 for(int suit = 1; suit <= 4; ++suit) for(int

我有一门卡片课

public class Card {

   private int value, suit;

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

   //gets, sets, toString
}
这是我通常填写卡片列表的方式

for(int suit = 1; suit <= 4; ++suit)
    for(int value = 1; value <= 13; ++value)
        Cards.add(new Card(value, suit));
for(int suit=1;适合新卡(值,适合));
Intellij在
.map(套装->新卡(套装,价值))

上面写着“lambda表达式中不兼容的返回类型卡”

这就是您想要的:

List<Card> cards = IntStream.rangeClosed(1, 4)
    .boxed()
    .flatMap(value -> 
        IntStream.rangeClosed(1, 13)
            .mapToObj(suit -> new Card(value, suit))
    )
    .collect(Collectors.toList());
List cards=IntStream.rangeClosed(1,4)
.boxed()
.flatMap(值->
IntStream.rangeClosed(1,13)
.mapToObj(套装->新卡(价值,套装))
)
.collect(Collectors.toList());
注意事项:

  • 由于基本体上的
    flatMap
    没有任何 类型转换重载,如
    flatMapToObj
    (不存在)

  • 分配给
    列表
    而不是
    数组列表
    ,因为
    收集器
    方法不会 保证它们返回的特定类型(正如目前所发生的那样)
    ArrayList
    ,但你不能依赖它)

  • 对于这种情况,请使用
    rangeClosed


另一种获得你想要的东西的方式(基于莫里斯·纳夫塔林的回答):

List cards=IntStream.rangeClosed(1,4)
.mapToObj(值->IntStream.rangeClosed(1,13)
.mapToObj(套装->新卡(价值,套装))
)
.flatMap(函数.identity())
.collect(收集器.toList())
;
需要注意的其他要点:

  • 您必须将int值映射到Stream streams,然后通过Function.identity()将flatMap表示为streams,因为flatMapToObj不存在,但所述操作可转换为map to Stream,然后转换为identity flatMap

我个人会继续在这里使用旧的Java 7样式,这种情况不太适合流使用。如果这是一个真正的应用程序,我可能会这样做,但我这样做只是为了更好地学习Lambdas。添加了一个基于IntStream::flatMapToObj(IntFunction)等同于IntStream::mapToObj(IntFunction)的答案然后是Stream::flatMap(函数)。我更喜欢这个,而不是我的解决方案,尽管@skiwi上面的评论仍然有效,命令式版本仍然更好。
List<Card> cards = IntStream.rangeClosed(1, 4)
    .boxed()
    .flatMap(value -> 
        IntStream.rangeClosed(1, 13)
            .mapToObj(suit -> new Card(value, suit))
    )
    .collect(Collectors.toList());
List<Card> cards = IntStream.rangeClosed(1, 4)
  .mapToObj(value -> IntStream.rangeClosed(1, 13)
    .mapToObj(suit -> new Card(value, suit))
  )
  .flatMap(Function.identity())
  .collect(Collectors.toList())
;