Java8关于stream一些优雅的代码
个人感想
以前自己在写代码时总是习惯写一些for或者双层for循环,其实这样的写法说白了就是很容易理解,按照自己的逻辑,一步一步的写,基本都可以实现相关的业务。但是在公司中接触了其他人的代码后,发现Java8中的stream等可以解决很多的for循环场景,让代码也变得比以前更优雅,更简洁。记录几个片段。
代码示例
for循环代码逻辑
//业务逻辑是:将result中exampleNameDTO中id值和exampleNameDTOList中id形同的进行合并,其中Result和ExampleNameDTO的实体类为
public class Result{
String name;
String id;
ExampleNameDTO exampleNameDTO;
}
public class ExampleNameDTO{
String id;
String A;
}
//代码的业务逻辑是将result中id和exampleNameDTO中id相同的,写入到result对象的ExampleNameDTO属性中
for (int i = 0; i < resultList.size(); i++) {
for (int j = 0; j < exampleNameDTOList.size(); j++) {
if (resultList.get(i).getId().equals(exampleNameDTOList.get(j).getId())) {
resultList.get(i).setExampleNameDTOList(exampleNameDTOList.get(j));
break;
}
}
}
chatGPT提供的优化代码
resultList.forEach(r -> {
Optional<ExampleNameDTO> exampleNameDTO = exampleNameDTOList.stream()
.filter(dto -> dto.getId().equals(r.getId())).findFirst();
exampleNameDTO.ifPresent(r::setProvinceAgencyNameDTO);
});
这个代码中的Optional类是Java 8引入的一个容器类,用于表示可能包含或不包含非空值的容器。它是一个泛型类,可以用于包装任何类型的对象。
从别人学习到的代码
Map<Long, ExampleNameDTO> exampleNameDTOMap = exampleNameDTOList.stream()
.collect(Collectors.toMap(ExampleNameDTO::getId, Function.identity(), (v1, v2) -> v2));
resultList.forEach(v -> v.setExampleNameDTO(exampleNameDTOMap.get(v.getId())));
这段代码也很巧妙,Function.identity()是Java 8中Function接口的一个静态方法,它返回一个函数,该函数接受一个参数并返回该参数本身。
- ExampleNameDTO::getId:这是一个方法引用,用于获取ExampleNameDTO对象的Id属性值。它作为键的提取函数,用于生成Map的键。
- Function.identity():这是一个方法引用,表示恒等函数,将对象本身作为值返回。它作为值的提取函数,用于生成Map的值。
- (v1, v2) -> v2:这是一个合并函数,用于指定当出现键冲突时如何处理。在这里,我们指定使用后来的值v2覆盖前面的值v1。