Java——list.stream().filter(item -> item.getType().equals(“type”)).findFirst()报空指针

本文介绍了Java中使用方法链时出现空指针异常的原因,包括list对象、item对象和type对象为null的情况。指出要确保对象正确初始化,可使用Optional类处理可能为空的对象,还可在Lambda表达式中过滤null元素,以避免空指针异常。
该文章已生成可运行项目,

在Java中使用list.stream().filter(item -> item.getType().equals(type)).findFirst()方法链时,出现空指针异常(NullPointerException)的原因可能是:

1. list对象为null

检查list是否已经正确初始化,确保其不为null。如果list为null,调用stream()方法时会导致空指针异常。

2. item对象为null

在Lambda表达式中调用item.getType()时,item可能为null。在调用方法之前,你应该确保item不为null。可以使用Optional类来处理可能为空的对象。

Optional<Item> optionalItem = list.stream()
    .filter(item -> item != null && item.getType().equals(type))
    .findFirst();

在上述示例中,我们首先检查item是否为null,然后再调用item.getType()方法。

3. type对象为null

在比较item.getType()type时,确保type不为null。如果type为null,那么调用type.equals()方法时会引发空指针异常。

Optional<Item> optionalItem = list.stream()
    .filter(item -> item != null && type != null && item.getType().equals(type))
    .findFirst();

在上述示例中,我们首先检查type是否为null,然后再调用type.equals()方法。

通过以上修改,你可以避免空指针异常,并在合适的情况下使用Optional类对结果进行处理。

注意:如果遍历的list本身包含null元素,你还需要注意空指针异常。在Lambda表达式中,可以使用item != null的条件来过滤掉null元素。

本文章已经生成可运行项目
@Override public PageResult<PurchaseOrderMainVO> queryPage(PurchaseOrderParam purchaseOrderParam) { // 查询主表数据 Page<PurchaseOrderMainDTO> page = new Page<>(purchaseOrderParam.getPageIndex(), purchaseOrderParam.getPageSize()); Page<PurchaseOrderMainDTO> mainPage = orderMainMapper.queryPurchaseOrderPage(page, purchaseOrderParam); if (CollectionUtils.isEmpty(mainPage.getRecords())) { return null; } // 构建复合键列表用于查询明细 List<CompositeKeyDTO> compositeKeys = mainPage.getRecords().stream() .map(main -> new CompositeKeyDTO( main.getPurchaseOrderNo(), main.getCompanyCode(), main.getSerialVersionNum() )) .collect(Collectors.toList()); // 查询明细数据 List<PurchaseOrderDetailsDTO> detailList = orderDetailMapper.queryDetailsByCompositeKeys(compositeKeys); // 按复合键分组明细数据 Map<String, List<PurchaseOrderDetailsDTO>> detailMap = detailList.stream() .collect(Collectors.groupingBy(detail -> detail.getPurchaseOrderNo() + "#" + detail.getCompanyCode() + "#" + detail.getSerialVersionNum() )); // 转换主表数据到VO List<PurchaseOrderMainVO> mainVOList = mainPage.getRecords().stream().map(mainDTO -> { PurchaseOrderMainVO mainVO = BeanCopyUtils.copyBean(mainDTO, PurchaseOrderMainVO.class); mainVO.setSpliceSupplierName(mainDTO.getSupplierCode() + " - " + mainDTO.getSupplierName()); mainVO.setSpliceFactoryName(mainDTO.getFactoryCode() + " - " + mainDTO.getFactoryName()); mainVO.setSpliceWarehouseName(mainDTO.getWarehouseCode() + " - " + mainDTO.getWarehouseName()); // 设置订单类型描述 if (mainDTO.getOrderType() != null) { PurchaseOrderTypeEnum typeEnum = Arrays.stream(PurchaseOrderTypeEnum.values()) .filter(e -> e.getTypeCode().equals(mainDTO.getOrderType())) .findFirst() .orElse(null); if (typeEnum != null) { mainVO.setType(typeEnum.getTypeCode()); } } // 设置明细数据 - 使用复合键 String compositeKey = mainDTO.getPurchaseOrderNo() + "#" + mainDTO.getCompanyCode() + "#" + mainDTO.getSerialVersionNum(); List<PurchaseOrderDetailsVO> detailVOList = new ArrayList<>(); if (detailMap.containsKey(compositeKey)) { detailVOList = detailMap.get(compositeKey).stream().map(detail -> { PurchaseOrderDetailsVO detailVO = BeanCopyUtils.copyBean(detail, PurchaseOrderDetailsVO.class); // 设置类型名称 if (detail.getType() != null) { PurchaseOrderPlanTypeEnum planTypeEnum = Arrays.stream(PurchaseOrderPlanTypeEnum.values()) .filter(e -> e.getTypeCode().equals(detail.getType())) .findFirst() .orElse(null); if (planTypeEnum != null) { detailVO.setTypeName(planTypeEnum.getTypeDesc()); } } return detailVO; }).collect(Collectors.toList()); } mainVO.setDetailsList(detailVOList); return mainVO; }).collect(Collectors.toList()); // 构建分页结果 PageResult<PurchaseOrderMainVO> result = new PageResult<>(); result.setRecords(mainVOList); result.setTotal(mainPage.getTotal()); result.setPageIndex(purchaseOrderParam.getPageIndex()); result.setPageSize(purchaseOrderParam.getPageSize()); return result; } 2025-09-28 19:41:11.349 [http-nio-9001-exec-3] DEBUG o.s.web.server.adapter.HttpWebHandlerAdapter - [774d9bf2] HTTP POST "/order/query" 2025-09-28 19:41:11.350 [http-nio-9001-exec-3] DEBUG o.s.w.r.r.m.a.RequestMappingHandlerMapping - [774d9bf2] Mapped to com.hvlink.controller.PurchaseOrderController#queryPage(PurchaseOrderParam) 2025-09-28 19:41:11.351 [http-nio-9001-exec-3] DEBUG o.s.w.r.r.m.a.RequestBodyMethodArgumentResolver - [774d9bf2] Content-Type:application/json 2025-09-28 19:41:11.351 [http-nio-9001-exec-3] DEBUG o.s.w.r.r.m.a.RequestBodyMethodArgumentResolver - [774d9bf2] 0..1 [com.hvlink.entity.param.order.PurchaseOrderParam] 2025-09-28 19:41:11.351 [http-nio-9001-exec-3] DEBUG o.s.http.codec.json.Jackson2JsonDecoder - [774d9bf2] Decoded [PurchaseOrderParam(factoryCode=, factoryName=null, warehouseCode=, warehouseName=null, purchaseOrder (truncated)...] 2025-09-28 19:41:11.352 [http-nio-9001-exec-3] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession 2025-09-28 19:41:11.352 [http-nio-9001-exec-3] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@798a6b6b] was not registered for synchronization because synchronization is not active 2025-09-28 19:41:11.378 [http-nio-9001-exec-3] DEBUG o.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource 2025-09-28 19:41:11.553 [http-nio-9001-exec-3] DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [ConnectionID:1 ClientConnectionId: 26a12f82-8ef8-4b10-bbc4-8e35841c56ab] will not be managed by Spring 2025-09-28 19:41:11.553 [http-nio-9001-exec-3] DEBUG c.h.m.o.T.queryPurchaseOrderPage_mpCount - ==> Preparing: SELECT COUNT(*) AS total FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY purchase_order_no, company_code ORDER BY serial_version_num DESC) AS rn FROM tb_order_main WHERE is_deleted = 0 AND order_type = 2) m LEFT JOIN tm_supplier s ON m.supplier_code = s.supplier_code AND m.company_code = s.company_code LEFT JOIN tm_factory f ON m.factory_code = f.factory_code AND m.company_code = f.company_code LEFT JOIN tm_warehouse w ON m.warehouse_code = w.warehouse_code AND m.company_code = w.company_code WHERE m.rn = 1 AND f.status = 1 AND w.status = 1 2025-09-28 19:41:11.554 [http-nio-9001-exec-3] DEBUG c.h.m.o.T.queryPurchaseOrderPage_mpCount - ==> Parameters: 2025-09-28 19:41:11.645 [http-nio-9001-exec-3] DEBUG c.h.m.o.T.queryPurchaseOrderPage_mpCount - <== Total: 1 2025-09-28 19:41:11.646 [http-nio-9001-exec-3] DEBUG c.h.m.o.TbOrderMainMapper.queryPurchaseOrderPage - ==> Preparing: SELECT m.id, m.company_code, m.purchase_order_no, m.publish_date, s.supplier_code, s.supplier_name, f.factory_code, f.factory_name, w.warehouse_code, w.warehouse_name, m.serial_version_num, m.order_type FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY purchase_order_no, company_code ORDER BY serial_version_num DESC) AS rn FROM tb_order_main WHERE is_deleted = 0 AND order_type = 2 ) m LEFT JOIN tm_supplier s ON m.supplier_code = s.supplier_code AND m.company_code = s.company_code LEFT JOIN tm_factory f ON m.factory_code = f.factory_code AND m.company_code = f.company_code LEFT JOIN tm_warehouse w ON m.warehouse_code = w.warehouse_code AND m.company_code = w.company_code WHERE m.rn = 1 and f.status = 1 and w.status = 1 ORDER BY s.supplier_code DESC, m.purchase_order_no DESC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY 2025-09-28 19:41:11.646 [http-nio-9001-exec-3] DEBUG c.h.m.o.TbOrderMainMapper.queryPurchaseOrderPage - ==> Parameters: 0(Long), 10(Long) 2025-09-28 19:41:11.749 [http-nio-9001-exec-3] DEBUG c.h.m.o.TbOrderMainMapper.queryPurchaseOrderPage - <== Total: 1 2025-09-28 19:41:11.749 [http-nio-9001-exec-3] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@798a6b6b] 2025-09-28 19:41:11.749 [http-nio-9001-exec-3] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession 2025-09-28 19:41:11.749 [http-nio-9001-exec-3] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@58989e1f] was not registered for synchronization because synchronization is not active 2025-09-28 19:41:11.750 [http-nio-9001-exec-3] DEBUG o.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource 2025-09-28 19:41:11.750 [http-nio-9001-exec-3] DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [ConnectionID:1 ClientConnectionId: 26a12f82-8ef8-4b10-bbc4-8e35841c56ab] will not be managed by Spring 2025-09-28 19:41:11.750 [http-nio-9001-exec-3] DEBUG c.h.m.o.T.queryDetailsByCompositeKeys - ==> Preparing: SELECT d.purchase_order_no, d.line_no, d.delivery_date, d.part_code, d.part_desc, d.unit, d.total_qty, d.required_qty, d.available_qty, d.shipped_qty, d.type, d.frequency, d.approval_code, d.serial_version_num, d.company_code, d.order_type FROM tb_order_detail d WHERE EXISTS ( SELECT 1 FROM ( VALUES (?, ?, ?) ) AS keys(purchase_order_no, company_code, serial_version_num) WHERE d.purchase_order_no LIKE '%' + keys.purchase_order_no + '%' AND d.company_code LIKE '%' + keys.company_code + '%' AND d.serial_version_num = keys.serial_version_num ) ORDER BY d.purchase_order_no DESC, d.line_no ASC, d.delivery_date DESC 2025-09-28 19:41:11.750 [http-nio-9001-exec-3] DEBUG c.h.m.o.T.queryDetailsByCompositeKeys - ==> Parameters: 5580000154(String), 8000(String), 1(String) 2025-09-28 19:41:11.852 [http-nio-9001-exec-3] DEBUG c.h.m.o.T.queryDetailsByCompositeKeys - <== Total: 1 2025-09-28 19:41:11.852 [http-nio-9001-exec-3] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@58989e1f] 2025-09-28 19:41:11.852 [http-nio-9001-exec-3] DEBUG o.s.w.r.r.m.annotation.ResponseBodyResultHandler - [774d9bf2] Using 'application/json' given [application/json, text/plain, */*] and supported [application/json, application/*+json, application/x-ndjson, text/event-stream] 2025-09-28 19:41:11.853 [http-nio-9001-exec-3] DEBUG o.s.w.r.r.m.annotation.ResponseBodyResultHandler - [774d9bf2] 0..1 [com.hvlink.common.Result<com.hvlink.pagination.PageResult<com.hvlink.entity.vo.order.PurchaseOrderMainVO>>] 2025-09-28 19:41:11.853 [http-nio-9001-exec-3] DEBUG o.s.http.codec.json.Jackson2JsonEncoder - [774d9bf2] Encoding [Result(status=200, msg=成功, data=PageResult(total=1, records=[PurchaseOrderMainVO(id=90858, purchaseO (truncated)...] 2025-09-28 19:41:11.854 [http-nio-9001-exec-3] DEBUG o.s.web.server.adapter.HttpWebHandlerAdapter - [774d9bf2] Completed 200 OK 为什么我返回的明细中没有数据? { "status": "200", "msg": "成功", "data": { "total": 1, "records": [ { "id": 90858, "purchaseOrderNo": "5580000154", "publishDate": null, "supplierCode": "0012000048", "supplierName": "上海信耀电子有限公司", "spliceSupplierName": "0012000048 - 上海信耀电子有限公司", "factoryCode": "8400", "factoryName": "华域视觉科技(常熟)有限公司采购工厂", "spliceFactoryName": "8400 - 华域视觉科技(常熟)有限公司采购工厂", "warehouseCode": "8404", "warehouseName": "车灯物流不良品仓", "spliceWarehouseName": "8404 - 车灯物流不良品仓", "serialVersionNum": "1", "type": 2, "detailsList": [] } ], "pageIndex": 1, "pageSize": 10 }, "timestamp": 1759059716284 }
09-29
package com.example.kucun2.DataPreserver; import android.util.Log; import com.example.kucun2.entity.data.SynchronizableEntity; import com.example.kucun2.entity.data.SynchronizedList; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; public class DataAssociator { private final DataStore dataStore; public DataAssociator(DataStore dataStore) { this.dataStore = dataStore; } public void automaticAssociation() { dataStore.dataCollectionMap.keySet().forEach(entityClass -> { try { associateEntities(dataStore.dataCollectionMap.get(entityClass)); } catch (Exception e) { Log.e("DataAssociator", "关联失败: " + entityClass.getSimpleName(), e); } }); } private void associateEntities(SynchronizedList<?> list) throws Exception { for (SynchronizableEntity entity : list.getViewList()) { if (entity == null) continue; for (Field field : entity.getClass().getDeclaredFields()) { field.setAccessible(true); Class<?> fieldType = field.getType(); if (SynchronizableEntity.class.isAssignableFrom(fieldType)) { associateSingleReference(entity, field); } else if (List.class.isAssignableFrom(fieldType)) { associateReferenceList(entity, field); } } } } private void associateSingleReference(SynchronizableEntity entity, Field field) throws Exception { SynchronizableEntity ref = (SynchronizableEntity) field.get(entity); if (ref == null) return; Class<?> targetType = field.getType(); SynchronizableEntity target = findTargetEntity(ref, targetType); field.set(entity, target); } private SynchronizableEntity findTargetEntity(SynchronizableEntity ref, Class<?> targetType) { SynchronizedList<?> targetList = dataStore.dataCollectionMap.get(targetType); if (targetList == null) return null; // 预置对象特殊处理 if (ref.getId() == -1) { return targetList.getViewList().stream() .filter(e -> e.getId() == -1) .findFirst().orElse(null); } // 根据ID查找实体 return targetList.getViewList().stream() .filter(e -> ref.getId().equals(e.getId())) .findFirst() .orElse(null); } private void associateReferenceList(SynchronizableEntity entity, Field field) throws Exception { Type genericType = field.getGenericType(); if (!(genericType instanceof ParameterizedType)) return; Type itemType = ((ParameterizedType) genericType).getActualTypeArguments()[0]; if (!(itemType instanceof Class) || !SynchronizableEntity.class.isAssignableFrom((Class<?>) itemType)) { return; } List<?> refList = (List<?>) field.get(entity); if (refList == null) { field.set(entity, new ArrayList<>()); return; } List<SynchronizableEntity> resolvedList = new ArrayList<>(); for (Object ref : refList) { if (ref instanceof SynchronizableEntity) { SynchronizableEntity resolved = findTargetEntity( (SynchronizableEntity) ref, (Class<?>) itemType ); if (resolved != null) resolvedList.add(resolved); } } field.set(entity, resolvedList); } } 详细注释
06-25
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值