Java Lambda表达式是什么,怎么用
这种代码是什么,怎么阅读
/*** 批量插入** @param entityList ignore* @param batchSize ignore* @return ignore*/@Transactional(rollbackFor = Exception.class)@Overridepublic boolean saveBatch(Collection<T> entityList, int batchSize) {String sqlStatement = getSqlStatement(SqlMethod.INSERT_ONE);return executeBatch(entityList, batchSize, (sqlSession, entity) -> sqlSession.insert(sqlStatement, entity));}
解读:
代码功能
这段代码的作用是 批量执行数据库插入操作,将 entityList
中的数据分批插入数据库,每批的大小由 batchSize
控制。
参数解析
entityList
需要插入数据库的实体对象列表(如
List<User>
)。
batchSize
每批次插入的数据量(例如
batchSize=100
表示每批插入 100 条数据)。
(sqlSession, entity) -> sqlSession.insert(sqlStatement, entity)
这是一个 Lambda 表达式,定义了如何执行单条插入操作:
sqlSession
:MyBatis 的数据库会话对象。entity
:当前要插入的实体对象。sqlSession.insert(sqlStatement, entity)
:执行插入操作,sqlStatement
是 MyBatis 映射文件(Mapper)中定义的 SQL 语句 ID(如"com.example.mapper.UserMapper.insert"
)。
executeBatch
方法的作用
executeBatch
是一个自定义的批量执行方法,它的内部逻辑可能类似于:
遍历
entityList
,按batchSize
分批次处理。对每个实体对象
entity
,调用传入的 Lambda 执行插入。可能包含事务管理(如每批提交一次,或失败回滚)。
代码等价逻辑
如果没有 Lambda,这段代码可能类似于:
for (Entity entity : entityList) {sqlSession.insert(sqlStatement, entity); // 单条插入if (i % batchSize == 0) {sqlSession.flushStatements(); // 刷新批次} }
关键点
批量插入优化
通过分批插入减少数据库压力,避免单次提交过多数据导致性能问题。
MyBatis 的
SqlSession
insert
方法需要指定sqlStatement
(对应 Mapper XML 中的 SQL 语句)。
Lambda 表达式
这里用 Lambda 抽象了单条数据的操作,方便复用(比如更新操作可以改为
sqlSession.update
)。
可能的完整上下文
假设这是一个工具类方法,可能定义如下:
java
复制
下载
public void executeBatch(List<Entity> entityList, int batchSize, BiConsumer<SqlSession, Entity> action) {for (int i = 0; i < entityList.size(); i++) {action.accept(sqlSession, entityList.get(i)); // 执行插入if ((i + 1) % batchSize == 0) {sqlSession.flushStatements(); // 批量提交}} }
注意事项
事务控制
如果需要在批处理失败时回滚,需确保
SqlSession
启用了事务。
性能权衡
batchSize
过大可能导致内存溢出,过小则效率低(通常建议 100-1000 之间)。
如果需要更具体的解释,可以补充 executeBatch
的实现或 MyBatis 配置细节!
Java Lambda表达式是什么
Java Lambda表达式是Java 8引入的一种匿名函数,用于简化函数式接口的实现,使代码更简洁、可读性更强。
Lambda表达式的基本概念
Lambda表达式(lambda expression)是一种匿名函数,基于数学中的λ演算得名,直接对应于其中的lambda抽象。它允许将函数作为方法的参数传递,从而简化代码。12
Lambda表达式的语法
Lambda表达式的基本语法如下:
- 无参数:
() -> expression
或() -> { statements; }
- 单参数:
parameter -> expression
或parameter -> { statements; }
- 多参数:
(parameter1, parameter2) -> expression
或(parameter1, parameter2) -> { statements; }
例如:
() -> 2
:返回值为2的无参Lambda表达式。x -> 2 * x
:接收一个参数并返回其2倍的值。(x, y) -> x + y
:接收两个参数并返回它们的和。
函数式接口
Lambda表达式需要与函数式接口(Functional Interface)配合使用。函数式接口是指仅包含一个抽象方法的接口,例如Runnable
、Comparator
等。Java 8提供了@FunctionalInterface
注解来标识函数式接口。