Java 8:垂直切片列表数组
Java 8: vertical slicing an array of Lists
我正在学习 Java 8 个 lambda 和流。
所以,我得到了一系列长度不同的列表。列表包含整数。
在另一个列表列表中收集垂直切片的最佳方法是什么,即从切片 0 中的所有原始列表中收集索引为 0 的所有整数,在切片 1 中收集索引 1 等等,直到最长列表的长度(为较短的列表填充零)
我知道为此手动编写几个传统循环代码很简单,但是使用 Java 8 个功能来实现这一点呢?
这是一个非常有趣的问题 - 感谢您发帖。我相信您会看到一些有趣的答案。这是我的尝试:
List<Integer> source[];
List<List<Integer>> slices = IntStream.range(0, Arrays.stream(source).mapToInt(List::size).max().getAsInt())
.mapToObj(index -> Arrays.stream(source).map(list -> list.size() > index ? list.get(index) : 0)
.collect(Collectors.toList()))
.collect(Collectors.toList())
这是一个不为较短的 List
s 插入填充值的解决方案:
List<List<Integer>> slices = Stream.of(source).flatMap(l->
IntStream.range(0, l.size()).mapToObj(i->new int[]{i, l.get(i)})
).collect(collectingAndThen(
groupingBy(a->a[0], TreeMap::new, mapping(a->a[1], toList())),
m->new ArrayList<>(m.values()))
);
这可以扩展为这样的零填充版本:
int maxSize=IntStream.range(0,source.length).map(i->source[i].size()).max().orElse(0);
List<List<Integer>> slices = Stream.of(source).flatMap(l->
Stream.concat(
IntStream.range(0, l.size()).mapToObj(i->new int[]{i, l.get(i)}),
IntStream.range(l.size(), maxSize).mapToObj(i->new int[]{i, 0})
)
).collect(collectingAndThen(
groupingBy(a->a[0], TreeMap::new, mapping(a->a[1], toList())),
m->new ArrayList<>(m.values()))
);
两种解决方案都假定您这样做 import static java.util.stream.Collectors.*;
,否则代码将变得非常不可读。
我正在学习 Java 8 个 lambda 和流。 所以,我得到了一系列长度不同的列表。列表包含整数。
在另一个列表列表中收集垂直切片的最佳方法是什么,即从切片 0 中的所有原始列表中收集索引为 0 的所有整数,在切片 1 中收集索引 1 等等,直到最长列表的长度(为较短的列表填充零)
我知道为此手动编写几个传统循环代码很简单,但是使用 Java 8 个功能来实现这一点呢?
这是一个非常有趣的问题 - 感谢您发帖。我相信您会看到一些有趣的答案。这是我的尝试:
List<Integer> source[];
List<List<Integer>> slices = IntStream.range(0, Arrays.stream(source).mapToInt(List::size).max().getAsInt())
.mapToObj(index -> Arrays.stream(source).map(list -> list.size() > index ? list.get(index) : 0)
.collect(Collectors.toList()))
.collect(Collectors.toList())
这是一个不为较短的 List
s 插入填充值的解决方案:
List<List<Integer>> slices = Stream.of(source).flatMap(l->
IntStream.range(0, l.size()).mapToObj(i->new int[]{i, l.get(i)})
).collect(collectingAndThen(
groupingBy(a->a[0], TreeMap::new, mapping(a->a[1], toList())),
m->new ArrayList<>(m.values()))
);
这可以扩展为这样的零填充版本:
int maxSize=IntStream.range(0,source.length).map(i->source[i].size()).max().orElse(0);
List<List<Integer>> slices = Stream.of(source).flatMap(l->
Stream.concat(
IntStream.range(0, l.size()).mapToObj(i->new int[]{i, l.get(i)}),
IntStream.range(l.size(), maxSize).mapToObj(i->new int[]{i, 0})
)
).collect(collectingAndThen(
groupingBy(a->a[0], TreeMap::new, mapping(a->a[1], toList())),
m->new ArrayList<>(m.values()))
);
两种解决方案都假定您这样做 import static java.util.stream.Collectors.*;
,否则代码将变得非常不可读。