Lambda 表达式本质上是对接口的实现,Lambda 表达式的参数列表本质上对应着接口中方法
的参数列表。Lambda 体本质上就是接口方法具体实现的功能。
Collectors.groupingBy
public static void main(String[] args) {
List<User> list = new ArrayList(){{
add(new User(10, "李四"));
add(new User(5, "张三"));
}};
// 默认为HashMap
Map<String, List<User>> collect = list.stream().peek(user -> {
System.out.println(user);
}).collect(Collectors.groupingBy(User::getName));
for (String s : collect.keySet()) {
System.out.println(s);
System.out.println(collect.get(s));
}
}
// 打印结果
User{age=10, name='李四'}
User{age=5, name='张三'}
李四
[User{age=10, name='李四'}]
张三
[User{age=5, name='张三'}]
public static void main(String[] args) {
List<User> list = new ArrayList(){{
add(new User(10, "李四"));
add(new User(5, "张三"));
}};
// 默认为HashMap
Map<String, List<User>> collect = list.stream().sorted(Comparator.comparingInt(User::getAge)).peek(user -> {
System.out.println(user);
}).collect(Collectors.groupingBy(User::getName));
for (String s : collect.keySet()) {
System.out.println(s);
System.out.println(collect.get(s));
}
}
// 打印结果
User{age=5, name='张三'}
User{age=10, name='李四'}
李四
[User{age=10, name='李四'}]
张三
[User{age=5, name='张三'}]
public static void main(String[] args) {
List<User> list = new ArrayList(){{
add(new User(10, "李四"));
add(new User(5, "张三"));
}};
// 指定为LinkedHashMap
Map<String, List<User>> collect = list.stream().sorted(Comparator.comparingInt(User::getAge)).peek(user -> {
System.out.println(user);
}).collect(Collectors.groupingBy(User::getName, LinkedHashMap::new, Collectors.toList()));
for (String s : collect.keySet()) {
System.out.println(s);
System.out.println(collect.get(s));
}
}
// 打印结果
User{age=5, name='张三'}
User{age=10, name='李四'}
张三
[User{age=5, name='张三'}]
李四
[User{age=10, name='李四'}]
由案例1和2可以看出不管排不排序,聚合操作后的结果都是无序的,因为它默认的是HashMap,所以如果要保证聚合后的顺序则需要指定使用LinkedHashMap,如案例三
flatMap将多个流合并成一个流,可用list的合并
List<String> answers = quAnswerDataVo.getAnswers().stream().flatMap(quAnswerDataSubConvert -> { String answerJSONArray = quAnswerDataSubConvert.getAnswer(); return JSONArray.parseArray(answerJSONArray, JSONObject.class).stream().map(jsonObject -> jsonObject.getString("id")); }).collect(Collectors.toList());
将list转换成键值对(Map)
Map<String, QuAnswerDataConvert> quAnswerDataVoMap = list. stream().collect(Collectors.toMap(QuAnswerDataConvert::getQuId, quAnswerDataConvert -> quAnswerDataConvert, (t, t2) -> t2));
注意:第三个参数(t, t2) -> t2),如果不传,key重复将会抛异常,
public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper) { return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new); }
,(t, t2) -> t2)表示key如果重复,则取第二个,就是覆盖