文章482
标签257
分类63

总结一个在技术交流群中解决群友的问题

前两天在Java技术交流群中有人问有谁会Lambda表达式的,我看了一下给解决了, 问题挺有意思的, 就在这里总结一下


问题是这样的:

在一个Set中保存的是Json字符串,希望通过Lambda表达式实现Json转JSONObject,然后对给定字段排序,然后修改时间戳为日期,最后返回List类型

其实在Java中用Lambda还是很简洁的,就写了一下:

import com.alibaba.fastjson.JSON;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

public class LambdaSort {

    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

    public static void main(String[] args) {
        Set<String> set = new HashSet<>();

        set.add("{\n" +
                "  \"name\": \"test1\",\n" +
                "  \"timeStamp\": 1123451235\n" +
                "}");
        set.add("{\n" +
                "  \"name\": \"test2\",\n" +
                "  \"timeStamp\": 12351251235\n" +
                "}");
        set.add("{\n" +
                "  \"name\": \"test3\",\n" +
                "  \"timeStamp\": 31235123512\n" +
                "}");

        List<Entity> list = new LinkedList<>();

        set.stream().map(x -> JSON.parseObject(x, Entity.class))
                .sorted((x, y) -> y.getTimeStamp().compareTo(x.getTimeStamp()))
                .forEach(x -> {
                    x.setTimeStamp(timeStamp2Date(x.getTimeStamp(), DATE_FORMAT));
                    list.add(x);
                });

        System.out.println(list);
    }

    /**
     * 时间戳转换成日期格式字符串
     *
     * @param seconds 精确到秒的字符串
     * @param format  日期格式
     */
    public static String timeStamp2Date(String seconds, String format) {
        if (seconds == null || seconds.isEmpty() || seconds.equals("null")) {
            return "";
        }
        if (format == null || format.isEmpty()) format = "yyyy-MM-dd HH:mm:ss";
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(new Date(Long.parseLong(seconds + "000")));
    }

    private static class Entity {
        private String name;
        private String timeStamp;

        public Entity() {
        }

        public Entity(String name, String timeStamp) {
            this.name = name;
            this.timeStamp = timeStamp;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getTimeStamp() {
            return timeStamp;
        }

        public void setTimeStamp(String timeStamp) {
            this.timeStamp = timeStamp;
        }

        @Override
        public String toString() {
            return "Entity{" +
                    "name='" + name + '\'' +
                    ", timeStamp='" + timeStamp + '\'' +
                    '}';
        }
    }
}

上面通过一个静态内部类Entity接收Json为实体类,Lambda的核心方法也就几行:

先通过map将String转为Entity,然后通过sort排序(注意这个排序),然后对于每个Entity设置转换字段,最后输出

set.stream().map(x -> JSON.parseObject(x, Entity.class))
        .sorted((x, y) -> y.getTimeStamp().compareTo(x.getTimeStamp()))
        .forEach(x -> {
            x.setTimeStamp(timeStamp2Date(x.getTimeStamp(), DATE_FORMAT));
            list.add(x);
        });

调用后输出:

[
Entity{name='test3', timeStamp='2959-10-20 23:11:52'}, 
Entity{name='test2', timeStamp='2361-05-25 15:07:15'}, 
Entity{name='test1', timeStamp='2005-08-08 05:47:15'}
]

但是这个群友又问我,为什么把.sort()改为:

.sorted(Comparator.comparing(x -> x.getTimeStamp()).reversed())

就报错了?

我看了一下,结果发现:当调用.reverse()之后Lambda返回的是Object类型!

此时使用强转类型转换:

.sorted(Comparator.comparing(x -> ((Entity) x).getTimeStamp()).reversed())

结果是正常的!

或者也可以使用静态引用

.sorted(Comparator.comparing(Entity::getTimeStamp).reversed())

如果觉得文章写的不错, 可以关注微信公众号: Coder张小凯

内容和博客同步更新~



本文作者:Jasonkay
本文链接:https://jasonkayzk.github.io/2020/03/03/总结一个在技术交流群中解决群友的问题/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可