简化一些常见的 Java 任务
下面总结是以不同的方式和更简单地处理事情。下面是一些基本的简化场景,很实用。
1、异步调用注解
@Async注解可以实现异步线程调用,用法简单,体验舒适。
@Service("asyncService") public class AsyncService { @Async("这里最好使用自己申明的线程") public void asyncMethod(){ //doing } }
总结了这个注解失效的场景,使用中可以规避。
添加图片注释,不超过 140 字(可选)
2、简化类设计
明确的单一职责
在软件系统中设计类时,必须保持它们的专注和凝聚力,以确保清晰的组织和可管理性。每个类都应该有一个定义明确的单一职责,并且不应该试图包含多个不相关的功能。集中的类设计方法不仅可以增强可读性和可维护性,还可以提高可重用性和测试的便利性:
public class Customer { private String name; private String email; public Customer(String name, String email) { this.name = name; this.email = email; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
在此特定情况中,Customer类的唯一职责是通过存储和管理客户的姓名和电子邮件信息来准确表示客户。这种深思熟虑的设计选择使类更易于理解和维护,从而简化了将来的更新和增强功能。
lombok注解简化。
@RequiredArgsConstructor 注解会生成一个包含所有 final 字段和带有 @NonNull 注解字段的构造函数
@NoArgsConstructor: 自动生成无参数构造函数。
@AllArgsConstructor: 自动生成全参数构造函数。
@Data: 自动为所有字段添加@ToString, @EqualsAndHashCode, @Getter方法,为非final字段添加@Setter,和@RequiredArgsConstructor
还有其他一些比如自动生成日志对象等等之类的注解可以到官方网站去了解,就不一一列举了可查官网
import lombok.Data; @Data public class Customer { private String name; private String email; }
lombok的官方地址:https://projectlombok.org/
lombok的Github地址:https://github.com/rzwitserloot/lombok
那么lombok到底是个什么呢,lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来说,比如我们新建了一个类,然后在其中写了几个字段,然后通常情况下我们需要手动去建立getter和setter方法啊,构造函数啊之类的,lombok的作用就是为了省去我们手动创建这些代码的麻烦,它能够在我们编译源码的时候自动帮我们生成这些方法。
lombok能够达到的效果就是在源码中不需要写一些通用的方法,但是在编译生成的字节码文件中会帮我们生成这些方法,这就是lombok的神奇作用。
虽然有人可能会说IDE里面都自带自动生成这些方法的功能,但是使用lombok会使你的代码看起来更加简洁,写起来也更加方便。
lombok的安装跟一般引用jar包没有什么区别,可以到官网上下载最新的jar包,然后导入到项目里面就好啦。
Maven添加依赖
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.10</version> </dependency> </dependencies>
Intellij idea开发的话需要安装Lombok plugin,同时设置 Setting -> Compiler -> Annotation Processors -> Enable annotation processing勾选。
3、使用 Streams 进行简单的数据处理
Java Streams 提供了以函数式编程风格处理数据的强大功能。它们可以通过提供一组高级操作(如 map、filter 和 reduce)来简化集合的操作,这些操作可以链接在一起以表示复杂的数据处理转换。
与传统循环和条件语句相比,使用 Java Streams 通常会产生更具可读性和简洁性的代码。这可以提高代码的可维护性并降低引入 bug 的风险:
import java.util.Arrays; import java.util.List; public class StreamExample { public static void main(String[] args) { List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David"); names.stream() .filter(name -> name.startsWith("A")) .forEach(System.out::println); } }
在这个特定的示例中,Optional用于管理getName方法返回null值的潜在情况。这种方法不仅提高了代码的清洁度,而且有助于其表达力和可读性。
4、使用 Java NIO 简化文件 I/O
NIO (New I/O) 软件包提供了一组 Java 库,用于执行高效的文件操作。它提供缓冲区、通道和内存映射文件等功能,可以极大地提高文件操作任务的性能和便利性。此软件包旨在提供标准 I/O API 的替代方案,为处理文件提供更高级、更灵活的方法。
之前:使用 FileInputStream/FileOutputStream:
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class OldFileIOExample { public void copyFile(String source, String destination) throws IOException { try (FileInputStream in = new FileInputStream(source); FileOutputStream out = new FileOutputStream(destination)) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } } } }
修改后:使用 NIO 文件
import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class NioFileIOExample { public void copyFile(String source, String destination) throws IOException { Path sourcePath = Paths.get(source); Path destinationPath = Paths.get(destination); Files.copy(sourcePath, destinationPath); } }
5、使用 JAXB 简化 XML 处理
可以使用 JAXB(用于 XML 绑定的 Java 体系结构)简化 XML 处理。
之前:使用 DOM 手动 XML 解析:
import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; public class ManualXmlExample { public void parseXml(String xmlString) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new ByteArrayInputStream(xmlString.getBytes())); Element root = doc.getDocumentElement(); String name = root.getElementsByTagName("name").item(0).getTextContent(); int age = Integer.parseInt(root.getElementsByTagName("age").item(0).getTextContent()); System.out.println("Name: " + name); System.out.println("Age: " + age); } }
之后:使用 JAXB:
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import java.io.StringReader; import lombok.Data; public class JaxbXmlExample { public void parseXml(String xmlString) throws JAXBException { JAXBContext context = JAXBContext.newInstance(User.class); Unmarshaller unmarshaller = context.createUnmarshaller(); User user = (User) unmarshaller.unmarshal(new StringReader(xmlString)); System.out.println("Name: " + user.getName()); System.out.println("Age: " + user.getAge()); } @Data static class User { private String name; private int age; } }
6、使用 MapStruct 简化对象映射
手动执行对象映射时,对象映射可能很繁琐且容易出错。MapStruct 为此过程提供了自动化功能:
之前:手动对象映射
import lombok.Data; public class ManualObjectMappingExample { public UserDTO mapToDTO(User user) { UserDTO dto = new UserDTO(); dto.setName(user.getName()); dto.setAge(user.getAge()); return dto; } @Data static class User { private String name; private int age; } @Data static class UserDTO { private String name; private int age; } }
之后:使用 MapStruct
import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; import lombok.Data; public class MapStructExample { public static void main(String[] args) { User user = new User("Alice", 30); UserMapper mapper = Mappers.getMapper(UserMapper.class); UserDTO dto = mapper.userToUserDTO(user); System.out.println("Name: " + dto.getName()); System.out.println("Age: " + dto.getAge()); } @Mapper public interface UserMapper { @Mapping(source = "name", target = "name") @Mapping(source = "age", target = "age") UserDTO userToUserDTO(User user); } @Data static class User { private String name; private int age; } @Data static class UserDTO { private String name; private int age; } }
更多Java学习资料请看百度云连接如下: