Я использую лямбда-выражения для обеспечения закрытия результирующего набора и подключения к базе данных.
В приведенном ниже коде я собираю переменные типа (activeList, inActiveList, user) . Во многих местах было сказано, что, хотя привязка (одноразовая стоимость) и стоимость вызова одинаковы для захвата и не захвата лямбд, захват лямбд не эффективен из-за промежуточной «стоимости захвата». При каждом вызове должен быть создан лямбда-объект. Для не захвата лямбды это один раз, тогда последующие вызовы будут повторно использовать тот же объект. Но для захвата лямбды каждый раз, когда должен быть создан объект.
Я добавил свой фрагмент кода ниже. Этот тип захвата лямбд чаще встречается в коде моего веб-приложения. Я предполагаю, что так как количество запросов на выборку, выполняемых для каждого запроса, относительно мало, использование этого типа захвата лямбда-выражений не окажет значительного влияния на производительность. Это правильно, или я делаю неправильно.
User user = getUser(id);
List<Integer> activeList = new ArrayList<>();
List<Integer> inActiveList = new ArrayList<>();
HashMap<String, Object> h = new HashMap<>();
DBUtil.execute(sqlQuery (rs) -> {
String id = rs.getString("id");
h.put("id", id)
h.put("name", rs.getString("name"));
if(user.isAdmin()){
h.put("pay", re.getInt("pay"))
}
int status = rs.getInt("status");
if(status == 1){
activeList.add(id);
} else if(status == 2){
inActiveList.add(id);
}
})
static void execute(String sql, Consumer<ResultSet> iteratorFn) {
try {
Connection conn = getConn();
Statement stmt = conn.createStatement(sql)
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
iteratorFn.accept(rs);
}
rs.close();
} finally {
if(stmt != null){
stmt.close()
}
if(conn != null){
conn.close()
}
}
}
Ссылка
https://ionutbalosin.com/2018/12/passing-thismethod-reference-within-a-loop-affects-performance/
https://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood/