我正在Stream
的数组上运行Integer
次操作
然后我创建一个Cell
对象,进行一些操作并应用过滤器,
我想创建一个只有有效Integer
的{{1}}到Cell
的地图。
这一行:
Cell
是否可以在流动作中使用原始流对象?
答案 0 :(得分:4)
如果Stream
操作创建了包含它的某个实例,则可以存储原始map
元素。
例如:
Map<Integer, Cell> map =
list.stream()
.map(x -> new SomeContainerClass(x,new Cell(x+1, x+2)))
.filter(container->isNewCellValid(container.getCell()))
.collect(Collectors.toMap(c->c.getIndex(),c->c.getCell()));
您可以使用一些现有的课程,而不是创建自己的SomeContainerClass
,例如AbstractMap.SimpleEntry
:
Map<Integer, Cell> map =
list.stream()
.map(x -> new AbstractMap.SimpleEntry<Integer,Cell>(x,new Cell(x+1, x+2)))
.filter(e->isNewCellValid(e.getValue()))
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));
答案 1 :(得分:1)
是否可以在流动作中使用原始流对象?
是的,直到您不使用Function<Cell, Integer>
操作。
您需要(Cell cell) -> cell.getFirst() - 1
来恢复原始值。在您的示例中,它是.collect(Collectors.toMap(cell -> cell.getFirst() - 1, Function.identity()));
:
Function<Integer, Cell>
我建议编写Function<Cell, Integer>
和final Function<Integer, Cell> xToCell = x -> new Cell(x + 1, x + 2);
final Function<Cell, Integer> cellToX = cell -> cell.getX1() - 1;
final Map<Integer, Cell> map =
list
.stream()
.map(xToCell)
.filter(cell -> isNewCellValid(cell))
.collect(Collectors.toMap(cellToX, Function.identity()));
函数,而不是为单个流进程构建不必要的包装类:
class Campaign {
private $mailchimp;
__construct(Mailchimp $mailchimp, someOtherArgument) {
}
}
当然,它可以简单或直观地反转操作。