Java 8流 - 沿流动作使用原始流对象

时间:2018-01-08 09:27:39

标签: java java-8 java-stream

我正在Stream的数组上运行Integer次操作 然后我创建一个Cell对象,进行一些操作并应用过滤器,
我想创建一个只有有效Integer的{​​{1}}到Cell的地图。

这一行:

Cell

是否可以在流动作中使用原始流对象?

2 个答案:

答案 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) {

    }
}

当然,它可以简单或直观地反转操作。