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