文章524
标签277
分类67

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

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


问题是这样的:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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设置转换字段,最后输出

1
2
3
4
5
6
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);
});

调用后输出:

1
2
3
4
5
[
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()改为:

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

就报错了?

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

此时使用强转类型转换:

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

结果是正常的!

或者也可以使用静态引用

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

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

内容和博客同步更新~



本文作者:Jasonkay
本文链接:https://jasonkayzk.github.io/cn/2020/03/03/%E6%80%BB%E7%BB%93%E4%B8%80%E4%B8%AA%E5%9C%A8%E6%8A%80%E6%9C%AF%E4%BA%A4%E6%B5%81%E7%BE%A4%E4%B8%AD%E8%A7%A3%E5%86%B3%E7%BE%A4%E5%8F%8B%E7%9A%84%E9%97%AE%E9%A2%98/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可