lambda的使用

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如果重复,则取第二个,就是覆盖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值