Java 8流-与其他累加器返回类型一起使用reduce

我有一段代码可用于生成PDF文档,它经过简化只是为了演示问题。

    PdfPTable table = new PdfPTable(new float[]{ 100.0f });
    List<PdfPCell> cells = new ArrayList<>();

    List<String> labels = Arrays.asList(
            Labels.ITEM_NAME,
            Labels.QUANTITY,
            Labels.PRICE
    );

    for (String label : labels) {
        PdfPCell cell = new PdfPCell(new Phrase(label));
        cells.add(cell);
    }

    for (PdfPCell cell : cells) {
        table.addCell(cell);
    }

我想将其转换为Java 8流的功能样式。

我知道我可以使用reduce来像这样使用JavaScript:

let container = { items: [] };

[1, 2, 3]
        .reduce((container, item) => { 
            container.items.push(item); 
            return container; 
        }, container);

console.log(container); // { items: [ 1, 2, 3 ] }

我试图在Java中使用相同的方法,所以我的代码是这样的:

PdfPTable myTable = Stream.of(
            Labels.ITEM_NAME,
            Labels.QUANTITY,
            Labels.PRICE)
            .map(s -> new PdfPCell(new Phrase(s)))
            .reduce(new PdfPTable(new float[]{ 100.0f }), (table, cell) -> {
                table.addCell(cell);
                return table;
            });

但这不是编译的,因为在reduce函数表中将其识别为单元格,类型不正确匹配。

What I am trying to use seems to be accumulator function, this is what my IDE shows me: enter image description here

从文档:

java.util.stream.Stream公共抽象T reduce(T标识,                            java.util.function.BinaryOperator累加器)对该流的元素进行归约,   使用提供的身份值和关联累积   函数,并返回减小的值。这等效于:
T result = identity;
 for (T element : this stream)
     result = accumulator.apply(result, element)
 return result;
但不限于顺序执行。身份价值   必须是累加器功能的标识。这意味着   全部t,accumulator.apply(identity,t)等于t。蓄能器   函数必须是关联函数。

所有示例都显示了诸如计算和之类的原始算术运算,并提到这些累加器函数必须是无状态的。我什至不确定我要尝试的内容是否正确,请告诉我。

评论
cvitae
cvitae

For mutable reduction you should use collect, not reduce:

PdfPTable myTable = 
    Stream.of(Labels.ITEM_NAME,Labels.QUANTITY,Labels.PRICE)
          .map(s -> new PdfPCell(new Phrase(s)))
          .collect(() -> new PdfPTable(new float[]{ 100.0f }), // supplier
                   (table, cell) -> table.addCell(cell), // accumulator
                   (table1,table2) -> table1.addAllCells(table2.getCells())); // combiner

For the combiner, I made some assumptions on methods which may or may not exist in your PdfPTable class, but that's the general idea.

点赞
评论