前言:
现时大家对“java建包后出现错误”大体比较关心,咱们都想要学习一些“java建包后出现错误”的相关资讯。那么小编同时在网上网罗了一些对于“java建包后出现错误””的相关内容,希望小伙伴们能喜欢,大家快快来学习一下吧!一、Redis使用过程中一些小的注意点
1、不要把Redis当成数据库来使用
二、Arrays.asList常见失误
需求:把数组转成list集合去处理。
方法:Arrays.asList 或者 Java8的stream流式处理
1)错误一
以下代码是否有问题?
int[] arr = {1, 2, 3};List list = Arrays.asList(arr);System.out.println(list);System.out.println(list.size());System.out.println(list.get(0).getClass());
日志:
[[I@4232c52b]1class [I
为什么打印出来的,不是我们想要的?
可以看到入参是泛型T类型可变参数,把 int数组 整体作为对象成为了T 传入了。
如何解决?
Integer[] arr2 = {1, 2, 3};List list2 = Arrays.asList(arr2);System.out.println(list2);System.out.println(list2.size());System.out.println(list2.get(0).getClass());
日志:
[1, 2, 3]3class java.lang.Integer
总结:不能直接使用Arrays.asList来转换基本类型数组。
2)错误二
现在我们已经转成list集合了,我们接下来,进行后续业务操作。
Integer[] arr2 = {1, 2, 3};List list2 = Arrays.asList(arr2);list2.add(4);System.out.println(list2);
这时候,一运行,又报错了!
java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at ListTest.test2(ListTest.java:30)
ListTest.java:30 是代码中的 list2.add(4);
原因:
发现:Arrays.asList返回的List并不是java.util.ArrayList,而是Arrays内部类ArrayList,它没有覆写父类的add方法,所以调用会报错。
解决:
重新new一个ArrayList初始化Arrays.asList返回的List即可。
Integer[] arr2 = {1, 2, 3};List list2 = Arrays.asList(arr2);ArrayList list3 = new ArrayList(list2);list3.add(4);System.out.println(list3);
总结:Arrays.asList返回的List不支持增删操作。
3)错误三
Integer[] arr2 = {1, 2, 3};List list2 = Arrays.asList(arr2);arr2[1] = 6;System.out.println(list2);
日志:
[1, 6, 3]
发现:对原始数组的修改影响到了我们获得的那个List。
解决:
重新new一个ArrayList初始化Arrays.asList返回的List即可。
Integer[] arr2 = {1, 2, 3};ArrayList list3 = new ArrayList(Arrays.asList(arr2));arr2[1] = 6;System.out.println(list3);
日志:
[1, 2, 3]
总结:对原始数组的修改影响到了我们获得的那个List。
三、日志记录常见问题四、Java8常见使用1)Lambda表达式
1、目的
Lambda表达式的初衷是进一步简化匿名类的语法。
2、简单实例
//匿名类new Thread(new Runnable() { @Override public void run() { System.out.println("hello1"); }}).start();//lambda表达式
new Thread(() -> System.out.println("hello1")).start();
在idea中快捷键:Alt + Enter 会看到提示,自动转成lambda表达式
2)Stream操作1、功能说明
可以对集合进行投影,转换,过滤,排序等操作。
2、准备工作
创建四个实体类,用于下方Demo的使用。
3、创建流3、创建流
创建流程一般有五种方式。
ream方法把List或数组转换成流
/** * list ==> 流 */List<String> list = Arrays.asList("a1", "a2", "a3");list.stream().forEach(System.out::println);/** * 数组 ==> 流 */Arrays.stream(new int[]{1, 2, 3}).forEach(System.out::println);
b.通过stream.of方法直接传入多个元素构成一个流程
String[] arr = {"a", "b", "c"};Stream.of(arr).forEach(System.out::println);Stream.of("a", "b", "c").forEach(System.out::println);Stream.of(1, 2, "a").forEach(System.out::println);
c.通过Stream.iterate方法使用迭代的方式构造一个无限流,然后使用limit限制流元素个数
Stream.iterate(2, item -> item * 2).limit(2).forEach(System.out::println);Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.TEN)).limit(3).forEach(System.out::println);
d.通过Stream.generate方法从外部传入一个提供元素的Supplier来构造无限流,
然后使用limit限制流元素个数。
Stream.generate(() -> "test").limit(3).forEach(System.out::println);Stream.generate(Math::random).limit(3).forEach(System.out::println);
e.通过IntStream或DoubleStream构造基本类型的流
IntStream.range(1, 5).forEach(System.out::println);DoubleStream.of(1.1, 2.2, 3.3).forEach(System.out::println);4、filter 过滤
可以实现过滤操作,类似SQL中的where,可以连续叠加filter方法进行多次过滤。
orders.stream() .filter(order -> order.getTotalPrice() > 40) .filter(order -> order.getCustomerId() == 1) .forEach(System.out::println);5、map 转换
可以做转换(就是投影),类似于SQL中的select。
通过map,可以把对象转换成其他对象。
a、小写转大写
List<String> a = Arrays.asList("a", "b", "c", "d");List<String> b = a.stream().map(String::toUpperCase).collect(Collectors.toList());System.out.println(a);System.out.println(b);
b、对象列表转字符串列表
List<String> collect = orders.stream().map(x -> x.getCustomerName()).collect(Collectors.toList());System.out.println(collect);
c、对象列表转其他对象列表
List<User> users = customers.stream().map(temp -> { User user = new User(); user.setCustomerId(temp.getId()); user.setName(temp.getName()); return user;}).collect(Collectors.toList());6、flatMap 展开
相当于 map + flat,通过map把每一个元素替换成一个流,然后展开这个流。
7、sorted 排序
可以用于排序,类似于SQL中的 order by。
orders.stream() .filter(order -> order.getTotalPrice() > 40) .sorted(Comparator.comparing(Order::getTotalPrice).reversed()) .limit(2) .forEach(System.out::println);8、distinct 去重
作用是去重,类似于SQL中的distinct。
List<String> list = Arrays.asList("AA", "BB", "CC", "AA", "BB");System.out.println(list);//[AA, BB, CC, AA, BB]List<String> collect = list.stream().distinct().collect(Collectors.toList());System.out.println(collect);//[AA, BB, CC]9、skip 和 limit 分页
用于分页,类似于MySQL中的limt。
skip实现跳过一定的项,limit用于限制项总数。
customers.stream() .sorted(Comparator.comparing(Customer::getId).reversed()) .map(customer -> customer.getId() + "@" + customer.getName()) .limit(2).forEach(System.out::println); //10@姓名10 //9@姓名9
customers.stream() .sorted(Comparator.comparing(Customer::getId).reversed()) .map(customer -> customer.getId() + "@" + customer.getName()) .skip(2).limit(2).forEach(System.out::println); //8@姓名8 //7@姓名710、collect 收集
收集操作,对流程进行终止操作。(终止意思是,后面无法再串联其他操作)
其他终止操作还有 forEach,toArray,min,max,cout,anyMatch等等。
#所有下单的用户,使用toSet去重后实现字符串的拼接String collect = orders.stream() .map(order -> order.getCustomerName()) .collect(Collectors.toSet()) .stream().collect(Collectors.joining(",", "[", "]"));System.out.println(collect); //[李四,张三]
#使用toCollection收集器指定集合类型LinkedList<Order> collect = orders.stream() .limit(2) .collect(Collectors.toCollection(LinkedList::new));System.out.println(collect);
Collectors类的一些常用静态方法:
【注意】Lambda表达式有个很大的缺点,就是不方便调试。
【解决】
1、使用2020.01版本的IDEA编辑器
2、使用peek方法
3)Optional类型4)并行流5)日期时间类1、简单介绍
在Java8之前处理日期时间时,使用Date,Calender 和 SimpleDateFormat,使用不方便。
而且无法申明时区。
2、项目背景
背景:
去年做的realme的pk大赛,服务器使用的是utc时间(世界标准时间),而Pk赛是印度的项目,业务逻辑需要使用印度时间。
解决:
写了一个UTC转印度时间的工具类,把new出来的时间往后加五个半小时,就是印度时间。
《【pk大赛】服务器UTC时间解决方案》
3、解决方案
1、对于Date类
Date 并无时区问题,世界上任何一台计算机使用 new Date() 初始化得到的时间
都一样。因为,Date 中保存的是 UTC 时间,UTC 是以原子钟为基础的统一时间,不以
太阳参照计时,并无时区划分。
Date 中保存的是一个时间戳,代表的是从 1970 年 1 月 1 日 0 点(Epoch 时间)到现在的毫秒数。
2、时区问题
如果不理会时区问题,会导致什么现象呢?
五、如何定位线上问题1)Arthas工具的使用
官方文档:
开源地址:
1、什么是Arthas
是Alibaba开源的Java诊断工具。
2、可以解决什么问题(摘抄自官网)
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!是否有一个全局视角来查看系统的运行状况?有什么办法可以监控到JVM的实时运行状态?怎么快速定位应用的热点,生成火焰图?
3、如何安装
标签: #java建包后出现错误