【问题标题】:Java 8 Lambda: Can I generate a new ArrayList of objects from an IntStream?Java 8 Lambda:我可以从 IntStream 生成新的对象 ArrayList 吗?
【发布时间】:2015-01-12 14:50:35
【问题描述】:

我有一个卡片类

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 -&gt; new Card(suit, value)) 下给我一个错误

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

【问题讨论】:

  • 我个人会在这里继续使用旧的 Java 7 风格,这种情况不适合 那么好 用于流使用。
  • 如果这是一个真正的应用程序,我可能会这样做,但我这样做只是为了更好地学习 Lambda。

标签: java lambda java-8


【解决方案1】:

这就是你想要的:

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

【讨论】:

  • 基于 IntStream::flatMapToObj(IntFunction>) 等效于 IntStream::mapToObj(IntFunction>) 然后 Stream::flatMap 的想法添加了一个答案(函数, Stream>).
【解决方案2】:

获得您想要的东西的另一种方式(基于 Maurice Naftalin 的回答):

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())
;

补充注意事项:

  • 您必须将 int 值映射到 Stream 流,然后通过 Function.identity() 对所述流进行 flatMap,因为 flatMapToObj 不存在,但所述操作可转换为映射到 Stream,然后是标识 flatMap。

【讨论】:

  • 我比我的解决方案更喜欢这个,尽管上面@skiwi 的评论仍然有效——命令式版本仍然更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
相关资源
最近更新 更多