问题1
一个集合中有两种数据,想通过一次stream 流 实现数据隔离,然后分别得到两种数据的集合
ArrayList<Integer> integers = CollectionUtil.newArrayList(-1, -2, -3, 0, 1, 23, 4);
Collector<Integer, ?, Map<Boolean, List<Integer>>> objectMapCollector = Collectors.partitioningBy(o -> o > 0);
Map<Boolean, List<Integer>> collect = integers.stream().collect(objectMapCollector);
System.out.println(JSONUtil.toJsonPrettyStr(collect));
问题2
获取 List<Map<String, Object>> 集合中的 所有map的value 集合
List<String> collect = data.stream()
.flatMap(map -> map.values().stream())
.map(String::valueOf).collect(Collectors.toList());
flatMap 收集多个处理数据流为一个流
问题3
将一组字符串,每个分别按照某种规则,转成另多个字符串,并返回一组数据
例如: 一组字符串为 A B C ,每个字符串都转成两种, 第一种前面加一个字符串,第二种后边加一个字符串
[“A”,“B”,“C”,“A.2”,“1,A”,“B.2”,“C.2”,“1,B”,“1,C”]
String name="A",age="B",add="C";
Set<String> collect = Stream.of(name, age, add)
.filter(StringUtils::hasText)
.flatMap(v -> Stream.of(
v,
String.join(",", "1", v),
String.join(".", v, "2")
)).collect(Collectors.toSet());
System.out.println(JSONUtil.toJsonStr(collect));
flatMap 收集多个处理数据流为一个流
问题4
用于sql拼接,例如拼接 入参为 集合 in条件; 入参为集合[1,2,3],最终得到 (1,2,3)
String collect = Arrays.asList("1", "2", "3").stream().collect(joining(",", "(", ")"));
问题5
收集 List<A> 中的一个列表集合List<B> 中的一个属性 合成一个List<T> 返回
例如:
pulic class A{
private Long id;
private String name;
private List<B> resList
}
pulic class B{
private Long id;
private String name;
}
我有集合List<A> 且其中 属性resList 有值,我想收集所有的对象B 的id
此时 我希望收集集合A中的resList中的对象B的id 为一个一维集合
List<Long> bIdList = listA.stream().flatMap(classA -> classA.getResList().stream())
.map(B::getId).collect(Collectors.toList());
总结:
java8的stream流真心强大,突然发现用了这么久,还是没用明白,继续~~