Java8关于stream一些优雅的代码

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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值