总结一个在技术交流群中解决群友的问题
前两天在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); }
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张小凯
内容和博客同步更新~