javapublic class Main { public static void main(String[] args) { int externalVar=10; Runnable task=() -> { externalVar +=5; // 修改外部变量 System.out.println(externalVar); }; new Thread(task).start(); }}
String result = "select * from where id = '#userId#' and name = '#userName#'";
Map<String,String> sysParams = new HashMap<String,String>();
sysParams.put("#userId#", "userId");
sysParams.put("#userName#", "userName");
sysParams.put("#realName#", "realName");
sysParams.put("#orgIds#", "orgIds");
sysParams.put("#departname#", "departname");
sysParams.put("#roleId#", "roleId");
for(Map.Entry<String, String> entry : sysParams.entrySet()){
if(result .contains(entry.getKey())){
result = result .replaceAll(entry.getKey(), AppDataUtils.replaceSysData(entry.getValue()));
}
}
但是如果用Lambda表达式呢,将会非常的简单,
但是我们会发现,result那里是会报错的:Local variable result defined in an enclosing scope must be final or effectively final
String result = "select * from where id = '#userId#' and name = '#userName#'";
Map<String,String> sysParams = new HashMap<String,String>();
sysParams.put("#userId#", "userId");
sysParams.put("#userName#", "userName");
sysParams.put("#realName#", "realName");
sysParams.put("#orgIds#", "orgIds");
sysParams.put("#departname#", "departname");
sysParams.put("#roleId#", "roleId");
sysParams.forEach((key,value)->{
if(result.contains(key)){
result = result.replaceAll(key, value);
}
});
../src/DemoTest.cpp: In function ‘intmain()':
../src/DemoTest.cpp:64:36: error: conversion from ‘std::function<void()>' to non-scalar type ‘std::function<void(int)>' requested
std::function<void(int)> funcf = funce;
^~~~~
make: *** [src/DemoTest.o] Error 1
src/subdir.mk:18: recipe for target 'src/DemoTest.o' failed
#include<iostream>
#include<functional>
#include<string>
using namespace std;
void funcd(std::string&&str){
printf("String address %p in funcd A, str %s\n", &str, str.c_str());
string strs = std::move(str);
printf("String address %p in funcd B, str %s, strs %s\n", &str, str.c_str(), strs.c_str());
}
void funcc(std::stringstr){
printf("String address %p in funcc, str %s\n", &str, str.c_str());
}
void funcb(std::string&str){
printf("String address %p in funcb, str %s\n", &str, str.c_str());
}
void funca(std::string&&str){
printf("String address %p in funca A, str %s\n", &str, str.c_str());
std::string stra = str;
printf("String address %p in funca B, str %s, stra %s\n", &str, str.c_str(), stra.c_str());
}
int main(){
std::string str = "test";
printf("String address %p in main A, str %s\n", &str, str.c_str());
funca(std::move(str));
printf("String address %p in main B, str %s\n", &str, str.c_str());
// funcb(std::move(str));
printf("String address %p in main C, str %s\n", &str, str.c_str());
funcc(std::move(str));
printf("String address %p in main D, str %s\n", &str, str.c_str());
std::string stra = "testa";
printf("String address %p in main E, stra %s\n", &stra, stra.c_str());
funcd(std::move(stra));
printf("String address %p in main F, stra %s\n", &stra, stra.c_str());
return 0;
}
上面这段代码在执行时,输出如下:
String address 0x7ffc833f4660 in main A, str test
String address 0x7ffc833f4660 in funca A, str test
String address 0x7ffc833f4660 in funca B, str test, stra test
String address 0x7ffc833f4660 in main B, str test
String address 0x7ffc833f4660 in main C, str test
String address 0x7ffc833f4680 in funcc, str test
String address 0x7ffc833f4660 in main D, str
String address 0x7ffc833f4680 in main E, stra testa
String address 0x7ffc833f4680 in funcd A, str testa
String address 0x7ffc833f4680 in funcd B, str , strs testa
String address 0x7ffc833f4680 in main F, stra
#include<iostream>
#include<functional>
#include<string>
using namespace std;
void bar(std::string&&str){
printf("String address %p in bar A, str %s\n", &str, str.c_str());
string strs = std::move(str);
printf("String address %p in bar B, str %s, strs %s\n", &str, str.c_str(), strs.c_str());
}
std::function<void()> bar_bar(std::string &&str) {
auto funf = [&str]() {
printf("String address %p (foo lambda) F, stra %s\n", &str, str.c_str());
};
return funf;
}
std::function<void()> foo(std::string &&str) {
printf("String address %p in foo A, str %s\n", &str, str.c_str());
// auto funa = [str]() {
// printf("String address %p (foo lambda) A, str %s\n", &str, str.c_str());
// bar(str);
// };
// funa();
//
// auto funb = [str]() {
// printf("String address %p (foo lambda) B, str %s\n", &str, str.c_str());
// bar(std::move(str));
// };
// funb();
// auto func = [str]() mutable {
// printf("String address %p (foo lambda) C, str %s\n", &str, str.c_str());
// bar(str);
// };
// func();
auto fund = [str]() mutable {
printf("String address %p (foo lambda) D, str %s\n", &str, str.c_str());
bar(std::move(str));
};
fund();
auto fune = [&str]() {
printf("String address %p (foo lambda) E, str %s\n", &str, str.c_str());
bar(std::move(str));
};
fune();
std::string stra = "testa";
return bar_bar(std::move(stra));
}
int main(){
std::string str = "test";
printf("String address %p in main A, str %s\n", &str, str.c_str());
auto funcg = foo(std::move(str));
printf("String address %p in main B, str %s\n", &str, str.c_str());
funcg();
return 0;
}
上面这段代码的输出如下:
Stringaddress0x7ffc9fe7c5c0 in main A, strtest
Stringaddress0x7ffc9fe7c5c0 in foo A, strtest
Stringaddress0x7ffc9fe7c540 (foo lambda) D, strtest
Stringaddress0x7ffc9fe7c540 in barA, strtest
Stringaddress0x7ffc9fe7c540 in barB,str, strstest
Stringaddress0x7ffc9fe7c5c0 (foo lambda) E, strtest
Stringaddress0x7ffc9fe7c5c0 in barA, strtest
Stringaddress0x7ffc9fe7c5c0 in barB,str, strstest
Stringaddress0x7ffc9fe7c5c0 in main B,str
Stringaddress0x7ffc9fe7c560 (foo lambda) F, stra����
javapublic class Main { public static void main(String[] args) { int externalVar=10; Runnable task=() -> { externalVar +=5; // 修改外部变量 System.out.println(externalVar); }; new Thread(task).start(); }}
String result = "select * from where id = '#userId#' and name = '#userName#'";
Map<String,String> sysParams = new HashMap<String,String>();
sysParams.put("#userId#", "userId");
sysParams.put("#userName#", "userName");
sysParams.put("#realName#", "realName");
sysParams.put("#orgIds#", "orgIds");
sysParams.put("#departname#", "departname");
sysParams.put("#roleId#", "roleId");
for(Map.Entry<String, String> entry : sysParams.entrySet()){
if(result .contains(entry.getKey())){
result = result .replaceAll(entry.getKey(), AppDataUtils.replaceSysData(entry.getValue()));
}
}
但是如果用Lambda表达式呢,将会非常的简单,
但是我们会发现,result那里是会报错的:Local variable result defined in an enclosing scope must be final or effectively final
String result = "select * from where id = '#userId#' and name = '#userName#'";
Map<String,String> sysParams = new HashMap<String,String>();
sysParams.put("#userId#", "userId");
sysParams.put("#userName#", "userName");
sysParams.put("#realName#", "realName");
sysParams.put("#orgIds#", "orgIds");
sysParams.put("#departname#", "departname");
sysParams.put("#roleId#", "roleId");
sysParams.forEach((key,value)->{
if(result.contains(key)){
result = result.replaceAll(key, value);
}
});
../src/DemoTest.cpp: In function ‘intmain()':
../src/DemoTest.cpp:64:36: error: conversion from ‘std::function<void()>' to non-scalar type ‘std::function<void(int)>' requested
std::function<void(int)> funcf = funce;
^~~~~
make: *** [src/DemoTest.o] Error 1
src/subdir.mk:18: recipe for target 'src/DemoTest.o' failed
#include<iostream>
#include<functional>
#include<string>
using namespace std;
void funcd(std::string&&str){
printf("String address %p in funcd A, str %s\n", &str, str.c_str());
string strs = std::move(str);
printf("String address %p in funcd B, str %s, strs %s\n", &str, str.c_str(), strs.c_str());
}
void funcc(std::stringstr){
printf("String address %p in funcc, str %s\n", &str, str.c_str());
}
void funcb(std::string&str){
printf("String address %p in funcb, str %s\n", &str, str.c_str());
}
void funca(std::string&&str){
printf("String address %p in funca A, str %s\n", &str, str.c_str());
std::string stra = str;
printf("String address %p in funca B, str %s, stra %s\n", &str, str.c_str(), stra.c_str());
}
int main(){
std::string str = "test";
printf("String address %p in main A, str %s\n", &str, str.c_str());
funca(std::move(str));
printf("String address %p in main B, str %s\n", &str, str.c_str());
// funcb(std::move(str));
printf("String address %p in main C, str %s\n", &str, str.c_str());
funcc(std::move(str));
printf("String address %p in main D, str %s\n", &str, str.c_str());
std::string stra = "testa";
printf("String address %p in main E, stra %s\n", &stra, stra.c_str());
funcd(std::move(stra));
printf("String address %p in main F, stra %s\n", &stra, stra.c_str());
return 0;
}
上面这段代码在执行时,输出如下:
String address 0x7ffc833f4660 in main A, str test
String address 0x7ffc833f4660 in funca A, str test
String address 0x7ffc833f4660 in funca B, str test, stra test
String address 0x7ffc833f4660 in main B, str test
String address 0x7ffc833f4660 in main C, str test
String address 0x7ffc833f4680 in funcc, str test
String address 0x7ffc833f4660 in main D, str
String address 0x7ffc833f4680 in main E, stra testa
String address 0x7ffc833f4680 in funcd A, str testa
String address 0x7ffc833f4680 in funcd B, str , strs testa
String address 0x7ffc833f4680 in main F, stra
#include<iostream>
#include<functional>
#include<string>
using namespace std;
void bar(std::string&&str){
printf("String address %p in bar A, str %s\n", &str, str.c_str());
string strs = std::move(str);
printf("String address %p in bar B, str %s, strs %s\n", &str, str.c_str(), strs.c_str());
}
std::function<void()> bar_bar(std::string &&str) {
auto funf = [&str]() {
printf("String address %p (foo lambda) F, stra %s\n", &str, str.c_str());
};
return funf;
}
std::function<void()> foo(std::string &&str) {
printf("String address %p in foo A, str %s\n", &str, str.c_str());
// auto funa = [str]() {
// printf("String address %p (foo lambda) A, str %s\n", &str, str.c_str());
// bar(str);
// };
// funa();
//
// auto funb = [str]() {
// printf("String address %p (foo lambda) B, str %s\n", &str, str.c_str());
// bar(std::move(str));
// };
// funb();
// auto func = [str]() mutable {
// printf("String address %p (foo lambda) C, str %s\n", &str, str.c_str());
// bar(str);
// };
// func();
auto fund = [str]() mutable {
printf("String address %p (foo lambda) D, str %s\n", &str, str.c_str());
bar(std::move(str));
};
fund();
auto fune = [&str]() {
printf("String address %p (foo lambda) E, str %s\n", &str, str.c_str());
bar(std::move(str));
};
fune();
std::string stra = "testa";
return bar_bar(std::move(stra));
}
int main(){
std::string str = "test";
printf("String address %p in main A, str %s\n", &str, str.c_str());
auto funcg = foo(std::move(str));
printf("String address %p in main B, str %s\n", &str, str.c_str());
funcg();
return 0;
}
上面这段代码的输出如下:
Stringaddress0x7ffc9fe7c5c0 in main A, strtest
Stringaddress0x7ffc9fe7c5c0 in foo A, strtest
Stringaddress0x7ffc9fe7c540 (foo lambda) D, strtest
Stringaddress0x7ffc9fe7c540 in barA, strtest
Stringaddress0x7ffc9fe7c540 in barB,str, strstest
Stringaddress0x7ffc9fe7c5c0 (foo lambda) E, strtest
Stringaddress0x7ffc9fe7c5c0 in barA, strtest
Stringaddress0x7ffc9fe7c5c0 in barB,str, strstest
Stringaddress0x7ffc9fe7c5c0 in main B,str
Stringaddress0x7ffc9fe7c560 (foo lambda) F, stra����