Kit*_*son 15 java java-8 java-stream
我正在努力学习java - stream.我能够做简单的迭代/过滤/地图/收集等.
当我试图收集每个3个元素并打印时,如本例所示,[收集每3个元素并打印等等...]
List<String> list = Arrays.asList("a","b","c","d","e","f","g","h","i","j");
int count=0;
String append="";
for(String l: list){
if(count>2){
System.out.println(append);
System.out.println("-------------------");
append="";
count=0;
}
append = append + l;
count++;
}
System.out.println(append);
Run Code Online (Sandbox Code Playgroud)
输出:
abc
-------------------
def
-------------------
ghi
-------------------
j
Run Code Online (Sandbox Code Playgroud)
我没有得到任何线索如何使用流这样做.我应该实现自己的收藏家来实现这一目标吗?
Ale*_* C. 17
您实际上可以使用a IntStream来模拟列表的分页.
List<String> list = Arrays.asList("a","b","c","d","e","f","g","h","i","j");
int pageSize = 3;
IntStream.range(0, (list.size() + pageSize - 1) / pageSize)
.mapToObj(i -> list.subList(i * pageSize, Math.min(pageSize * (i + 1), list.size())))
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
哪个输出:
[a, b, c]
[d, e, f]
[g, h, i]
[j]
Run Code Online (Sandbox Code Playgroud)
如果你想生成字符串,你可以使用,String.join因为你List<String>直接处理:
.mapToObj(i -> String.join("", list.subList(i * pageSize, Math.min(pageSize * (i + 1), list.size()))))
Run Code Online (Sandbox Code Playgroud)
And*_*eas 10
你可以创建自己的Collector.最简单的方法是打电话Collector.of().
由于您的用例需要按顺序处理值,因此这里的实现不支持并行处理.
public static Collector<String, List<List<String>>, List<List<String>>> blockCollector(int blockSize) {
return Collector.of(
ArrayList<List<String>>::new,
(list, value) -> {
List<String> block = (list.isEmpty() ? null : list.get(list.size() - 1));
if (block == null || block.size() == blockSize)
list.add(block = new ArrayList<>(blockSize));
block.add(value);
},
(r1, r2) -> { throw new UnsupportedOperationException("Parallel processing not supported"); }
);
}
Run Code Online (Sandbox Code Playgroud)
测试
List<String> input = Arrays.asList("a","b","c","d","e","f","g","h","i","j");
List<List<String>> output = input.stream().collect(blockCollector(3));
output.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
产量
[a, b, c]
[d, e, f]
[g, h, i]
[j]
Run Code Online (Sandbox Code Playgroud)
如果你的项目中有Guava,你可以使用Iterables.partition方法:
import com.google.common.collect.Iterables;
import com.google.common.collect.Streams;
...
Stream<List<String>> stream = Streams.stream(Iterables.partition(list, 3));
Run Code Online (Sandbox Code Playgroud)
我这样解决了:
List<String> list = Arrays.asList("a","b","c","d","e","f","g","h","i","j");
int groupBy = 3;
AtomicInteger index = new AtomicInteger(0);
Map<Integer, List<String>> groups = list.stream()
.collect(Collectors.groupingBy(cdm -> index.getAndIncrement()/groupBy));
System.out.println(groups);
Run Code Online (Sandbox Code Playgroud)
它准备一个地图,其中行号为键,行上的字符串在键中。