让我们考虑:List <String> ints = Arrays.asList("1","2","3","4","5","6")
,并且让k=2
。
我们想要返回以下列表 List<String> : ["12", "23", "34", "45", "56"]
优雅的解决方案呢?有没有可能使用流来实现?
当然可以用多种方式解决,最简单的方法是迭代整个列表并使用嵌套列表 1...k
。
有什么想法吗?
让我们考虑:List <String> ints = Arrays.asList("1","2","3","4","5","6")
,并且让k=2
。
我们想要返回以下列表 List<String> : ["12", "23", "34", "45", "56"]
优雅的解决方案呢?有没有可能使用流来实现?
当然可以用多种方式解决,最简单的方法是迭代整个列表并使用嵌套列表 1...k
。
有什么想法吗?
使用流:
final List<String> ints = Arrays.asList("1", "2", "3", "4", "5", "6");
final int k = 2;
final List<String> result = IntStream.iterate(0, i -> i + 1).limit(ints.size() - k + 1)
.mapToObj(i -> ints.subList(i, i + k).stream().reduce("", (a, b) -> a + b + ""))
.collect(Collectors.toList());
System.out.println(result);3
使用for循环:
List<String> result = new LinkedList<>();
for(int i = 0 ; i < ints.size() - k + 1; i++) {
StringBuilder sb = new StringBuilder();
for(int j = 0; j < k; j++) {
sb.append(ints.get(i+j));
}
result.add(sb.toString());
}
System.out.println(result);
Collection<String>
而不是List<String>
,那么你可以使用Java 9的Collectors.flatMapping
:Collection<String> result = IntStream.range(0, ints.size() - k)
.boxed()
.collect(Collectors.groupingBy(i -> i,
Collectors.flatMapping(i -> ints.subList(i, i + k).stream(),
Collectors.joining())))
.values();
另一种方式,类似于IEE1394的答案:
List<String> result = IntStream.range(0, ints.size() - k)
.mapToObj(i -> String.join("", ints.subList(i, i + k)))
.collect(Collectors.toList());
new ArrayList<>()
构造函数,以获取一个列表返回。 - Lino