您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Java业务开发常见错误

时间:2021-12-27 10:49:07  来源:  作者:CF07

一、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]
1
class [I

为什么打印出来的,不是我们想要的?

Java业务开发常见错误

 

可以看到入参是泛型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]
3
class 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);

原因:

Java业务开发常见错误

 


Java业务开发常见错误

 


Java业务开发常见错误

 

发现: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表达式

Java业务开发常见错误

 

2)Stream操作

1、功能说明

可以对集合进行投影,转换,过滤,排序等操作。

2、准备工作

创建四个实体类,用于下方Demo的使用。

Java业务开发常见错误

 


Java业务开发常见错误

 


Java业务开发常见错误

 

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@姓名7

10、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类的一些常用静态方法:

Java业务开发常见错误

 

【注意】Lambda表达式有个很大的缺点,就是不方便调试。

【解决】

1、使用2020.01版本的IDEA编辑器

https://www.jetbrains.com/help/idea/analyze-java-stream-operations.html

2、使用peek方法

3)Optional类型

4)并行流

5)日期时间类

1、简单介绍

在Java8之前处理日期时间时,使用Date,Calender 和 SimpleDateFormat,使用不方便。

而且无法申明时区。

 

2、项目背景

背景:

去年做的realme的pk大赛,服务器使用的是utc时间(世界标准时间),而Pk赛是印度的项目,业务逻辑需要使用印度时间。

解决:

写了一个UTC转印度时间的工具类,把new出来的时间往后加五个半小时,就是印度时间。


https://shimo.im/docs/yJggDyvktT8DJdhc/ 《【pk大赛】服务器UTC时间解决方案》

Java业务开发常见错误

 

 

3、解决方案

1、对于Date类

  • Date 并无时区问题,世界上任何一台计算机使用 new Date() 初始化得到的时间

都一样。因为,Date 中保存的是 UTC 时间,UTC 是以原子钟为基础的统一时间,不以

太阳参照计时,并无时区划分。

  • Date 中保存的是一个时间戳,代表的是从 1970 年 1 月 1 日 0 点(Epoch 时间)到现在的毫秒数。

2、时区问题

如果不理会时区问题,会导致什么现象呢?

五、如何定位线上问题

1)Arthas工具的使用

官方文档:
https://alibaba.github.io/arthas/

开源地址:
https://github.com/alibaba/arthas/blob/master/README_CN.md

1、什么是Arthas

是Alibaba开源的Java诊断工具。

2、可以解决什么问题(摘抄自官网)

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到JVM的实时运行状态?
  • 怎么快速定位应用的热点,生成火焰图?

3、如何安装



Tags:Java   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  Tags: Java  点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Tags: Java  点击:(5)  评论:(0)  加入收藏
1、通过条件判断给变量赋值布尔值的正确姿势// badif (a === &#39;a&#39;) { b = true} else { b = false}// goodb = a === &#39;a&#39;2、在if中判断数组长度不为零...【详细内容】
2021-12-24  Tags: Java  点击:(5)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  Tags: Java  点击:(10)  评论:(0)  加入收藏
传统游戏项目一般使用TCP协议进行通信,得益于它的稳定和可靠,不过在网络不稳定的情况下,会出现丢包严重。不过近期有不少基于UDP的应用层协议,声称对UDP的不可靠进行了改造,这意...【详细内容】
2021-12-23  Tags: Java  点击:(11)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  Tags: Java  点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  Tags: Java  点击:(10)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  Tags: Java  点击:(14)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  Tags: Java  点击:(17)  评论:(0)  加入收藏
给新手朋友分享我收藏的前端必备javascript已经写好的封装好的方法函数,直接可用。方法函数总计:41个;以下给大家介绍有35个,需要整体文档的朋友私信我,1、输入一个值,将其返回数...【详细内容】
2021-12-15  Tags: Java  点击:(19)  评论:(0)  加入收藏
▌简易百科推荐
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(11)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(12)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(10)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(10)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(14)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(17)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(21)  评论:(0)  加入收藏
一、概述观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察...【详细内容】
2021-12-13  唯一浩哥    Tags:Java   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条