java 如何使用IntStream对相同长度的列表的列表进行行优先遍历

llmtgqce  于 2023-04-04  发布在  Java
关注(0)|答案(1)|浏览(125)

我有一个working code,它把这个:

public static void main(String[] args) {
    new Columns()
        .addLine("One", "Two", "Three", "Four")
        .addLine("1", "2", "3", "4")
        .print()
    ;
}

变成这样:

One Two Three Four 
1   2   3     4

但是,在尝试用this also working code改进它,并遵循关于here的建议时,我尝试替换这个工作的toString()代码:

public String toString(){
    
    final StringBuilder result = new StringBuilder();
    final int rows = columns.get(0).size();

    IntStream
        .range(0, rows)
        .forEach( 
            row -> {
                result
                    .append( 
                        columns
                        .stream()
                        .map(col -> col.getCell(row))
                        .collect( Collectors.joining(columnSeparator) )
                    )
                ;
                result.append( System.lineSeparator() );
            }
        )
    ;

    return result.toString();
}

下面的代码是toString()was following this

public String toString(){
    
    final int rows = columns.get(0).size();
    
    return IntStream
        .range(0, rows)
        .flatMap(row -> columns
            .stream()
            .map( col -> col.getCell(row) )
            .collect( Collectors.joining(columnSeparator) )
        )
        .collect( Collectors.joining( System.lineSeparator() ) )
    ;
}

却看到了这个

Columns.java:81: error: incompatible types: bad return type in lambda expression
                .collect( Collectors.joining(columnSeparator) )
                        ^
    inference variable R has incompatible bounds
      equality constraints: String
      lower bounds: IntStream,Object
  where R,A,T are type-variables:
    R extends Object declared in method <R,A>collect(Collector<? super T,A,R>)
    A extends Object declared in method <R,A>collect(Collector<? super T,A,R>)
    T extends Object declared in interface Stream
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error

对此我只能说老鼠
如果你是那种讨厌点击链接的人,这里是你错过的亮点:

private final List<Column> columns = new ArrayList<>();

在下面的Column类中,我们可以找到

public String getCell(int row){
    return padCell( words.get(row), maxLength );
}

我得到的建议是:“将toString中的StringBuilder替换为另一个连接Collector。”
toString试图逐行遍历这些列,并将在每一列中找到的填充字符串单元格连接起来。在进入下一行之前,完成所有列中的一行单元格。
是的,我知道一个简单的双for循环可以做到这一点,但其中的乐趣在哪里?
老实说,它的工作,但留下不必要的列分隔符挂在一边,这臭虫我

pes8fvy9

pes8fvy91#

你的外部流调用flatMap(),它应该将每个元素扩展成一个流(在本例中,IntStream)并将结果扁平化回一个流。它失败了,因为提供的函数返回单个字符串而不是流。由于结果是一对一的,你只需要一个普通的map操作将每行转换成字符串:

return IntStream
    .range(0, rows)
    .mapToObj(row -> columns
        .stream()
        .map( col -> col.getCell(row) )
        .collect( Collectors.joining(columnSeparator) )
    )
    .collect( Collectors.joining( System.lineSeparator() ) )
;

相关问题