google guava nesting joiner

时间:2011-10-05 21:49:52

标签: java guava nested

Google Guava中的Joiner(谷歌收藏的超集)非常酷。我的问题是,有一种简单的方法来处理嵌套集合吗? 例如,我有一个矩阵,它是一个行列表,每行都是一个数字列表:

List<ArrayList<Integer>> matrix = Lists.newArrayList( //
            Lists.newArrayList(1, 2, 3), //
            Lists.newArrayList(4, 5, 6), //
            Lists.newArrayList(7, 8, 9));

我想通过使用新行作为行分隔符和“,”作为数字的分隔符来输出此矩阵。那就是:

1, 2, 3
4, 5, 6
7, 8, 9

如果它只是一行,我可以简单地使用一些代码,如“Joiner.on(”,“)。nums”。对于这个嵌套的情况,我必须循环所有行。

有更优雅的方式吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

循环对我来说似乎很好。也就是说,你可以做:

// implementation is simple enough
public static Function<Iterable<?>, String> joinFunction(Joiner joiner) { ... }

String string = Joiner.on('\n').join(
    Iterables.transform(matrix, joinFunction(Joiner.on(", "))));

你在那里失去了一些效率,因为你不能将所有文本都附加到单个StringBuilder,但我认为循环可能更容易理解。

答案 1 :(得分:0)

在Java 8中,可以使用lambda:

String s = matrix.stream()
            .map(row -> row.stream().map(Object::toString).collect(Collectors.joining(",")))
            .collect(Collectors.joining("\n"));