首先,据我了解,您不会在地图上进行操作,而只能使用此地图中的列表。
因此可以在第一次操作中提取列表并拆分字符串。
List<List<String>> listOfListOfStrings = map.values().stream()
.map(v -> Arrays.asList(v.get(0).split("_")[0], v.get(0).split("_")[1], v.get(1)))
.collect(Collectors.toList());
之后,可以计算每列的最大(固定)长度。
List<Integer> maxSpacesForEachColumn = listOfListOfStrings.stream()
.map(a ->
a.stream().map(String::length).collect(Collectors.toList())
)
.reduce(Collections.nCopies(listOfListOfStrings.get(0).size(), 0), (a, v) ->
IntStream
.range(0, a.size())
.mapToObj(i -> a.get(i) > v.get(i) ? a.get(i) : v.get(i))
.collect(Collectors.toList())
);
最后这两个集合可以组合在一起。对于右垫String.format 使用:
listOfListOfStrings.stream()
.map(v -> IntStream
.range(0, maxSpacesForEachColumn.size())
.mapToObj(i ->
String.format("%1$-" + maxSpacesForEachColumn.get(i) + "s", v.get(i)))
.collect(Collectors.joining("|")))
.forEach(System.out::println);
显然它不是一行,但尝试这样做会使代码不可读。该解决方案也可能非常难以理解。但是创建listOfListOfStrings 只针对您的域,之后其余代码都是通用的。