我有一个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循环可以做到这一点,但其中的乐趣在哪里?
老实说,它的工作,但留下不必要的列分隔符挂在一边,这臭虫我
1条答案
按热度按时间pes8fvy91#
你的外部流调用
flatMap()
,它应该将每个元素扩展成一个流(在本例中,IntStream
)并将结果扁平化回一个流。它失败了,因为提供的函数返回单个字符串而不是流。由于结果是一对一的,你只需要一个普通的map操作将每行转换成字符串: