我有一个卡片类
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/