{"@attributes":{"version":"2.0"},"channel":{"title":"Lambda on \u9694\u53f6\u9ec4\u83ba Yanbin's Blog - \u8f6f\u4ef6\u7f16\u7a0b\u5b9e\u8df5","link":"https:\/\/yanbin.blog\/tags\/lambda\/","description":"Recent content in Lambda on \u9694\u53f6\u9ec4\u83ba Yanbin's Blog - \u8f6f\u4ef6\u7f16\u7a0b\u5b9e\u8df5","generator":"Hugo -- gohugo.io","language":"en-us","managingEditor":"yabqiu@gmail.com (Yanbin Qiu)","webMaster":"yabqiu@gmail.com (Yanbin Qiu)","copyright":"Yanbin \u9694\u53f6\u9ec4\u83ba","lastBuildDate":"Tue, 18 Nov 2025 21:28:49 -0600","item":[{"title":"\u7528 Rust \u5199 AWS Lambda \u7684\u7b80\u5355\u4f8b\u5b50","link":"https:\/\/yanbin.blog\/rust-write-aws-lambda-simple-example\/","pubDate":"Tue, 18 Nov 2025 21:28:49 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/rust-write-aws-lambda-simple-example\/","description":"\nAWS \u5728 2025-11-14 \u65e5\u53d1\u5e03\u4e86 <a href=\"https:\/\/aws.amazon.com\/about-aws\/whats-new\/2025\/11\/aws-lambda-rust\/\">AWS Lambda adds support for Rust<\/a>, \u5373 AWS \u6b63\u5f0f\u652f\u6301\u7528 Rust \u5199 Lambda \u4e86, \u56de\u987e\u5230\u4e4b\u524d AWS \u4e3a Rust \u63d0\u4f9b SDK \u662f\u4e24\u5e74\u524d\u7684 2023-11-27: <a href=\"https:\/\/aws.amazon.com\/about-aws\/whats-new\/2023\/11\/aws-sdk-rust\/\">AWS SDK for Rust is now generally available<\/a>.\u00a0<br\/><br\/>\n\u65e5\u5e38\u4e2d\u603b\u6709\u51e0\u4e2a\u7f16\u7a0b\u8bed\u8a00\u662f\u8981\u53bb\u638c\u63e1\u7684, \u50cf\u57fa\u672c\u7684\u811a\u672c Bash, \u7f51\u9875\u7528\u7684 JavaScript, \u5927\u9879\u76ee\u7528\u7684 Java, AI \u65f6\u4ee3\u7684 Python, \u518d\u5c31\u662f\u4eff\u4f5b Rust \u4e5f\u662f\u7ed5\u4e0d\u8fc7\u7684. \u4e4b\u524d\u6709\u5b66\u8fc7 Rust, \u5230\u73b0\u5728\u5fd8\u5dee\u4e0d\u591a\u4e86, \u53c8\u770b\u5230 Tauri, AWS Lambda \u5bf9 Rust \u7684\u5927\u529b\u652f\u6301\uff0c\u6709\u5fc5\u8981\u653e Rust \u63d0\u5230\u4e0e Python, Java \u4e00\u6837\u7684\u5730\u4f4d\u6765\u770b\u5f85\u3002\u5c3d\u7ba1\u5b66\u4e60\u8d77\u6765\u6bd4 C\/C++ \u8fd8\u9661\u5ced\uff0c\u50cf \u89e3\u5f15\u7528, Either(Result, Error), Unwrap, Borrow, Move, Ownership \u7b49\u6982\u5ff5\u53ca\u89c4\u5219\u9700\u6162\u6162\u53bb\u719f\u6089\u3002<br\/><br\/>\n\u4ece AWS \u63a7\u5236\u53f0\u770b\u770b Lambda \u662f\u600e\u4e48\u5bf9 Rust \u63d0\u4f9b\u652f\u6301\u7684\uff0c\u521b\u5efa\u51fd\u6570\u65f6\uff0cRuntime\u00a0\u4e2d\u53ef\u4ee5\u9009\u62e9<br\/><br\/>\n<table style=\"border-collapse: collapse; width: 100%;\">\n<tbody>\n<tr>\n<td style=\"width: 32.2526%;\">\n<img class=\"aligncenter post-image\"\nsrc=\"https:\/\/yanbin.blog\/posts\/2025\/rust-write-aws-lambda-simple-example\/aws-lambda-rust-1.png\"\nwidth=\"273px\"\n\/>\n<\/td>\n<td style=\"width: 28.2428%;\">Amazon Linux 2023<br \/>\n<span style=\"font-size: 10pt; color: #6b6666;\">OS-only runtime for Go, Rust, C++, custom<\/span><\/td>\n<td style=\"width: 28.3659%;\">Amazon Linux 2<br \/>\n<span style=\"color: #6b6666; font-size: 10pt;\">OS-only runtime for Go, Rust, C++, custom<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<br\/>\nOS \u65b9\u9762\u5f53\u7136\u662f\u8981\u9009\u62e9 Amazon Linux 2023 \u4f18\u4e8e Amazon Linux 2\u3002\u9009\u62e9 Amazon Linux 2023 \u6216 Amazon Linux 2 \u65f6\u6700\u540e\u8fd8\u6709\u4e00\u4e2a custom\uff0c\u4e5f\u5c31\u662f\u8bf4\u53ef\u4ee5\u81ea\u4e49\u7684\u5b9a\u4e49\u81ea\u5df1\u7684 Lambda \u8fd0\u884c\u65f6\uff0c\u53ef\u9009\u62e9\u4efb\u4f55\u8bed\u8a00\uff0c\u53ea\u8981\u7b26\u5408 AWS Lambda \u8c03\u7528\u7684\u63a5\u53e3\u89c4\u8303 <a href=\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/runtimes-api.html\">Using the Lambda runtime API for custom runtimes<\/a> \u5373\u53ef\u3002\u4e0d\u8fc7\u5b8c\u5168\u5b9a\u4e49\u5417\uff0c\u8fd8\u633a\u7f57\u55e6\u7684\uff0c\u7528\u5b98\u65b9\u76f4\u63a5\u652f\u6301\u7684\u8bed\u8a00\u5c31\u5bb9\u6613\u591a\u4e86\u3002"},{"title":"\u8c03\u7528 AWS Lambda \u65f6\u5982\u4f55\u4f20\u9001\u5b57\u8282\u6570\u7ec4","link":"https:\/\/yanbin.blog\/invoke-aws-lambda-with-bytes\/","pubDate":"Tue, 20 Aug 2024 12:52:35 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/invoke-aws-lambda-with-bytes\/","description":"\n\u672c\u6587\u4e3b\u8981\u9a8c\u8bc1\u7528 Python \u5199\u7684 AWS Lambda \u4e0e Java \u5ba2\u6237\u7aef\u4e4b\u95f4\u5982\u4f55\u53cc\u5411\u4f20\u9012\u4e8c\u8fdb\u5236\u6570\u636e\uff0c\u8fd9\u91cc\u4e0d\u6d89\u53ca\u5230 Lambda\u00a0\u6d41\u8f93\u5165\u8f93\u51fa\u7684\u95ee\u9898\u3002\u6bd4\u5982\u4e00\u4e2a Python AWS Lambda \u7684\u5904\u7406\u65b9\u6cd5\u58f0\u660e\u662f<br\/>\n<blockquote>\ndef lambda_handler(event, context):<br \/>\n\u00a0 \u00a0 pass\u00a0 # or do something\n<\/blockquote>\n\u901a\u8fc7\u6211\u4eec\u7528 Lambda \u8c03\u7528\u65f6\u4f1a\u4f20\u7ed9 <code>event<\/code> \u4e00\u4e2a JSON \u683c\u5f0f\u7684\u5b57\u7b26\u4e32\uff0c\u53cd\u5e94\u5230 AWS Lambda \u65f6 <code>event<\/code> \u5c31\u662f\u4e00\u4e2a\u5b57\u5178\u3002\u4f46\u5f53\u8981\u4f20\u9012\u4e8c\u8fdb\u5236\u6570\u636e\u5982\u4f55\u505a\u5462\uff1f\u76f4\u89c9\u7684\u505a\u6cd5\u5c31\u662f\u7528 base64 \u7f16\u7801\u4e8c\u8fdb\u5236\u5b57\u8282\u4e3a\u666e\u901a\u7684\u5b57\u7b26\u4e32\uff0c\u6bd4\u5982\u8981\u8282\u7ea6\u7f51\u7edc\u4f20\u8f93\u7684\u6570\u636e\u91cf\uff0c\u9700\u8981\u5bf9\u6587\u672c\u8fdb\u884c\u538b\u7f29\uff0c\u683c\u5f0f\u53ef\u4ee5\u662f\u8fd9\u6837<br\/>\n<blockquote>\n{\"input\": base64Encode(gzipCompress(\"text content......\"))}\n<\/blockquote>\n\u7136\u540e\u5728 Lambda \u7aef\u53d6\u51fa <code>input<\/code> \u7684\u503c\u4f5c\u76f8\u5e94\u7684 base64 \u89e3\u7801\u518d\u89e3\u538b\u7f29\u3002<br\/><br\/>\n\u5bf9\u4e8e\u5927\u6587\u672c\uff0c\u5373\u4f7f\u662f\u538b\u7f29\u540e\u518d\u7f16\u7801\u4e3a base64 \u4e5f\u6bd4\u76f4\u63a5\u4f20\u9001\u539f\u59cb\u6587\u672c\u6570\u636e\u8981\u8282\u7ea6\u7f51\u7edc\u5e26\u5bbd\u3002<br\/><br\/>\n\u8fd9\u79cd\u65b9\u6848\u5b9e\u9645\u4e5f\u662f\u53ef\u884c\u7684\uff0c\u7136\u800c\u6211\u4eec\u5728\u5b9e\u9645\u4f7f\u7528 Java AWS Lambda SDK \u65f6\u6709\u4e9b\u52a8\u4f5c\u4f1a\u81ea\u52a8\u5e2e\u6211\u4eec\u5b9e\u73b0\u7684\uff0c\u90a3\u5c31\u662f\u4e8c\u8fdb\u5236\u6570\u636e\u81ea\u52a8 base64 \u7f16\u7801\u3002"},{"title":"\u7528 C++ \u5199\u4e00\u4e2a AWS Lambda Hello World","link":"https:\/\/yanbin.blog\/cpp-aws-lambda-hello-world\/","pubDate":"Sat, 08 Jun 2024 14:10:15 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/cpp-aws-lambda-hello-world\/","description":"\nAWS \u81ea 2014 \u5e74\u63a8\u51fa Lambda \u65f6\u4ec5\u652f\u6301 Node.js\uff0c\u800c\u540e\u6dfb\u52a0\u4e86\u5bf9 Python, Ruby, Java, C#, F#, PowerShell \u7684\u652f\u6301\uff0c\u518d\u6765\u5230 2018 \u5e74\u53ef\u4ee5\u81ea\u5b9a\u4e49\u8fd0\u884c\u65f6\u4e86\uff0c\u6bd4\u5982\u7528\u6027\u80fd\u8f83\u597d\u7684 C, C++, Rust, Go \u7b49\u8bed\u8a00\u3002\u89c1 <a href=\"https:\/\/aws.amazon.com\/about-aws\/whats-new\/2018\/11\/aws-lambda-now-supports-custom-runtimes-and-layers\/\">AWS Lambda Now Supports Custom Runtimes and Enables Sharing Common Code Between Functions<\/a>.<br\/><br\/>\n\u5982\u679c\u4f7f\u7528 Python, Java \u5199 Lambda \u65f6\u89c9\u5f97\u8fd8\u4e0d\u5f97\u5feb\uff0c\u4e0d\u60f3\u8981\u660e\u663e\u7684\u9884\u70ed\u8fc7\u7a0b\uff0c\u4e5f\u8bb8 1000 \u6beb\u79d2\u7684\u4efb\u52a1\u53ea\u60f3\u8981 600 \u6beb\u79d2\u5c31\u80fd\u5b8c\u6210\uff0c\u5185\u5b58\u8fd8\u5e0c\u671b\u518d\u538b\u7f29\u4e00\u4e9b\uff0c\u90a3\u7740\u5b9e\u80fd\u5728\u6bcf\u6708\u5343\u767e\u4e07\u6b21 Lambda \u8c03\u7528\u7684\u60c5\u51b5\u4e0b\u8282\u7701\u4e00\u7b14\u53ef\u89c2\u7684\u652f\u51fa\uff0c\u90a3\u4e48\u53ef\u4ee5\u8bd5\u4e00\u8bd5 C, C++, Rust, Go \u7b49\u7f16\u8bd1\u6210\u4e86\u673a\u5668\u6307\u4ee4\u7684\u8bed\u8a00\uff0c\u51b5\u4e14\u524d\u4e09\u8005\u6ca1\u6709 GC, \u6267\u884c\u6548\u7387\u4f1a\u66f4\u9ad8\u3002<br\/><br\/>\n\u672c\u65e5\u5fd7\u8bb0\u5f55\u4e00\u4e0b\u5982\u4f55\u7528 C++ \u521b\u5efa\u4e00\u4e2a AWS Lambda, \u4ee5\u53ca\u53ef\u5982\u4f55\u5e94\u4ed8 Lambda \u7684\u590d\u7528\u3002\u672c\u6587\u4e3b\u8981\u53c2\u8003\u81ea\u4e0b\u9762\u4e24\u5904<br\/>\n<ol>\n<li><a href=\"https:\/\/aws.amazon.com\/blogs\/compute\/introducing-the-c-lambda-runtime\/\">Introducing the C++ Lambda Runtime<\/a><\/li>\n<li>GitHub \u9879\u76ee <a href=\"https:\/\/github.com\/awslabs\/aws-lambda-cpp\">aws-lambda-cpp<\/a><\/li>\n<\/ol>\n<br\/>\n\u81ea\u5b9a\u4e49\u8fd0\u884c\u65f6\u53ef\u9009\u62e9 X86_64 \u6216 arm64 \u7684 Amazon Linux 2023 \u6216 Amazon Linux 2\u3002\u90e8\u7f72\u65f6\u53ef\u9009\u62e9\u7684 runtime \u76f8\u5e94\u6709 provided.al2023, provided.al2, \u63a8\u8350\u4f7f\u7528 provided.al2023\u3002runtime provided \u4e0d\u88ab\u652f\u6301\u4e86\u3002<br\/><br\/>\nC++ \u4ee3\u7801\u53ef\u9009\u62e9\u7528 GCC \u6216 Clang \u6765\u7f16\u8bd1\uff0c\u65e2\u7136 AWS Lambda \u5b9e\u9645\u7684\u8fd0\u884c\u65f6\u4f1a\u7528\u5230 Amazon Linux 2023\uff0c\u90a3\u6211\u4eec\u5c31\u76f4\u63a5\u9009\u62e9 Docker \u955c\u50cf amazonlinux:2023 \u4f5c\u4e3a\u6211\u4eec\u7684\u7f16\u8bd1\u73af\u5883\u3002"},{"title":"AWS Step Function \u5f02\u6b65\u52a8\u6001\u8c03\u7528 Lambda \u540e\u6c47\u96c6\u7ed3\u679c","link":"https:\/\/yanbin.blog\/aws-step-function-async-call-dynamic-lambdas-aggregation\/","pubDate":"Mon, 19 Jun 2023 11:59:03 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/aws-step-function-async-call-dynamic-lambdas-aggregation\/","description":"\n\u5206\u5e03\u5f0f\u8ba1\u7b97\u6709\u8fd9\u4e48\u4e00\u4e2a\u9700\u6c42\uff0c\u4e3b\u8fdb\u7a0b\u51c6\u5907\u597d\u8f93\u5165\u6570\u636e\uff0c\u7136\u540e\u6839\u636e\u8f93\u5165\u4e2d\u67d0\u4e2a Items \u52a8\u6001\u8c03\u7528\u82e5\u5e72\u8ba1\u7b97\u8fdb\u7a0b\uff0c\u5f85\u5230\u6240\u6709\u8ba1\u7b97\u5b8c\u6210\u540e\u518d\u6c47\u96c6\u7ed3\u679c\u3002\u8fd9\u4e00\u9700\u6c42\u79fb\u690d\u5230 AWS \u4e0a\u5c31\u50cf\u662f\u4e0b\u9762\u8fd9\u6837\u5b50<br\/><br\/>\n<img class=\"aligncenter post-image\"\nsrc=\"https:\/\/yanbin.blog\/posts\/2023\/aws-step-function-async-call-dynamic-lambdas-aggregation\/lambda-sync-call-1-1.png\"\nwidth=\"400px\"\n\/>\n\u4f46\u5728\u4e00\u4e2a Lambda \u4e2d\u540c\u6b65\u8c03\u7528\u5176\u4ed6 Lambda \u65f6\u5c31\u6709\u4e2a\u8d39\u65f6\u8d39\u94b1\u7684\u95ee\u9898\uff0c\u867d\u7136\u6211\u4eec\u91c7\u7528\u7ebf\u7a0b\u6c60\u6765\u8c03\u7528 Lambda2, \u7531\u4e8e\u6bcf\u4e2a\u540c\u6b65\u8c03\u7528\u7684\u8017\u65f6\u4e0d\u76f8\u540c\uff0c Lambda1 \u6700\u7ec8\u8981\u7b49\u5f85\u6700\u6162\u7684\u90a3\u4e2a\u8c03\u7528\u7ed3\u675f\u540e\u624d\u80fd\u5bf9\u6240\u6709\u7ed3\u679c\u8fdb\u884c\u805a\u96c6\u5904\u7406\u3002\u8fd9\u5c31\u662f\u8457\u540d\u7684\u201c\u957f\u677f\u6548\u5e94\u201d, Lambda1 \u591a\u6570\u65f6\u5019\u662f\u5728\u65e0\u8c13\u7684\u7b49\u5f85\u5f53\u4e2d\u6d88\u8017\u7740\u4f60\u7684\u94b1\u8d22\u3002"},{"title":"\u5e94\u7528 AWS Lambda \u90e8\u7f72 FastAPI","link":"https:\/\/yanbin.blog\/deploy-fastapi-on-aws-lambda\/","pubDate":"Mon, 01 May 2023 14:31:45 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/deploy-fastapi-on-aws-lambda\/","description":"\n\u524d\u4e24\u5e74\u7528 AWS Lambda \u642d\u914d API Gateway \u4f7f\u7528\u662f\u4e3a\u4e86\u7701\u94b1\uff0c\u56e0\u4e3a\u6ca1\u6709\u8bf7\u6c42\u65f6\u4e0d\u82b1\u94b1\u3002\u53c8\u7531\u4e8e\u662f Rest API, \u6240\u4ee5\u5b9e\u73b0\u90e8\u5206\u7528\u4e86 FastAPI \u7684\u88c5\u9970\u5668\uff0c\u4f46\u4e0d\u5b9e\u9645\u542f\u52a8 FastAPI \u7684 Web \u670d\u52a1\uff0cLambda \u7684 handler \u65b9\u6cd5\u6839\u636e routeKey \u624b\u52a8\u6620\u5c04\u5230 FastAPI \u7684\u88c5\u9970\u65b9\u6cd5\u3002\u5927\u6982\u5b9e\u73b0\u662f<\/p>\n<blockquote>\ndef lambda_handler(event: dict, context):<br \/>\n\u00a0 \u00a0 fastapi_function = locate_fastapi_function(event['routeKey'])<br \/>\n\u00a0 \u00a0 return fastapi_function(&lt;extract parameters from event&gt;)\n<\/blockquote>\n\u5f53\u65f6\u4e5f\u601d\u8003\u7740\u80fd\u4e0d\u80fd\u628a Lambda \u7684\u8bf7\u6c42\u4e0e FastAPI \u7684 Web \u670d\u52a1\u6865\u63a5\u8d77\u6765\uff0c\u5374\u53c8\u4e0d\u80fd\u771f\u6b63\u542f\u52a8\u4e00\u4e2a\u00a0 Web \u670d\u52a1\uff0c\u5426\u5219 Lambda \u8c03\u7528\u4e0d\u80fd\u7ed3\u675f\u3002\u6bd4\u5982\u8bf4 AWS Lambda \u6536\u5230\u8bf7\u6c42\u65f6\u5feb\u901f\u542f\u52a8 FastAPI \u670d\u52a1\uff0c\u8be5\u670d\u52a1\u7ed1\u5b9a\u5230\u00a0 TCP \u7aef\u53e3\u6216 Socket \u6587\u4ef6\u90fd\u884c\uff0c\u7136\u540e Lambda \u8bf7\u6c42\u4ee3\u7406\u5230 FastAPI \u670d\u52a1\uff0c\u6700\u540e\u5173\u95ed FastAPI \u670d\u52a1\uff0c\u4f46\u662f\u60f3\u6765\u90fd\u4e0d\u90a3\u4e48\u5bb9\u6613\u5b9e\u73b0\u3002"},{"title":"\u914d\u7f6e AWS Lambda Python Logging","link":"https:\/\/yanbin.blog\/config-aws-lambda-python-logging\/","pubDate":"Tue, 25 Jan 2022 22:17:29 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/config-aws-lambda-python-logging\/","description":"\n\u901a\u5e38\u5728 Python \u5e94\u7528\u4e2d\u7b80\u5355\u7684\u914d\u7f6e\u4f7f\u7528\u5185\u7f6e\u7684 logging\u00a0\u662f\u8fd9\u6837\u7684<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-python\" data-lang=\"python\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kn\">import<\/span> <span class=\"nn\">logging<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"n\">logging_format<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">&#39;<\/span><span class=\"si\">%(asctime)s<\/span><span class=\"s1\"> - <\/span><span class=\"si\">%(levelname)s<\/span><span class=\"s1\"> - <\/span><span class=\"si\">%(module)s<\/span><span class=\"s1\">(<\/span><span class=\"si\">%(funcName)s<\/span><span class=\"s1\">:<\/span><span class=\"si\">%(lineno)d<\/span><span class=\"s1\">) - <\/span><span class=\"si\">%(message)s<\/span><span class=\"s1\">&#39;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"n\">logging<\/span><span class=\"o\">.<\/span><span class=\"n\">basicConfig<\/span><span class=\"p\">(<\/span><span class=\"n\">level<\/span><span class=\"o\">=<\/span><span class=\"n\">logging<\/span><span class=\"o\">.<\/span><span class=\"n\">INFO<\/span><span class=\"p\">,<\/span> <span class=\"nb\">format<\/span><span class=\"o\">=<\/span><span class=\"n\">logging_format<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"n\">logging<\/span><span class=\"o\">.<\/span><span class=\"n\">info<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;hello world&#39;<\/span><span class=\"p\">)<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u5047\u5982\u6587\u4ef6\u540d\u4e3a test.py, \u7528 python test.py \u6267\u884c\u540e\u8f93\u51fa<br\/>\n<blockquote>\n2022-01-25 21:02:47,231 - INFO - test(&lt;module&gt;:6) - hello world\n<\/blockquote>\n<h3>\u5728 Lambda\u00a0\u4e2d\u7684\u73b0\u8c61<\/h3>\n\u53ef\u662f\u8fd9\u540c\u6837\u7684\u4ee3\u7801\u653e\u5230 AWS Lambda Python \u4ee3\u7801\u4e2d\u5374\u4e0d\u7075\u9a8c\u4e86\uff0c<code>logging.info()<\/code> \u5c06\u5f97\u4e0d\u5230\u4efb\u4f55\u8f93\u51fa\u3002"},{"title":"\u6784\u5efa AWS Lambda Python Docker \u955c\u50cf","link":"https:\/\/yanbin.blog\/build-aws-lambda-python-docker-image\/","pubDate":"Mon, 08 Nov 2021 17:00:58 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/build-aws-lambda-python-docker-image\/","description":"\nAWS \u7684 Lambda \u5728 2020-12-01 \u5f00\u59cb\u652f\u6301\u7528 Docker \u955c\u50cf\u5b58\u653e\u4ee3\u7801\uff0c\u89c1 <a href=\"https:\/\/aws.amazon.com\/blogs\/aws\/new-for-aws-lambda-container-image-support\/\">New for AWS Lambda - Container Image Support<\/a>\u3002AWS Lambda \u6700\u521d\u7684\u5bf9\u53d1\u5e03\u5305\u7684\u9650\u5236\u662f 50M, \u89e3\u538b\u540e(\u56e0\u4e3a\u6267\u884c\u524d\u9700\u8981\u89e3\u538b\u7f29)\u4e0d\u80fd\u8d85\u8fc7 250M\uff0c\u5bf9\u4e8e\u538b\u7f29\u6bd4\u5c0f\u4e8e 1\/5 \u7684\u5305\u6765\u8bf4\uff0c\u8981\u7a81\u7834 50M \u90e8\u7f72\u5305\u7684\u9650\u5236\u5c31\u8981\u7528 2018-11-29 \u63a8\u51fa\u7684\u5c42(<a href=\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/configuration-layers.html\">layer<\/a>), \u5373\u628a Lambda \u7684\u4f9d\u8d56\u53ef\u4ee5\u7ec4\u7ec7\u4e3a\u5c42\uff0c\u6bcf\u4e2a Lambda \u53ef\u5f15\u7528\u6700\u591a 5 \u4e2a\u5c42\uff0c\u4f46\u6700\u7ec8 Lambda \u52a0\u4e0a\u5c42\u6240\u89e3\u538b\u540e\u7684\u5927\u5c0f\u4ecd\u7136\u6709 250 M \u7684\u9650\u5236\u3002<br\/><br\/>\n\u5bf9\u4e8e\u4f7f\u7528\u4e86\u5927\u91cf\u4f9d\u8d56\u7684 Lambda\uff0c\u6bd4\u5982 Python \u4e2d\u7528\u4e86 Pandas \u4e4b\u7c7b\u7684\u6570\u5b66\u5206\u6790\u5305\uff0c250M \u7684\u5927\u5c0f\u662f\u4e0d\u591f\u7684\uff0c\u6240\u4ee5\u624d\u6709\u4e86 Docker \u955c\u50cf\u5316\u7684 Lambda, \u955c\u50cf\u7684\u5927\u5c0f\u9650\u5236\u4e00\u4e0b\u8e66\u5230 10G\uff0c\u8981\u6784\u5efa\u51fa\u4e00\u4e2a 10G Lambda \u7528\u7684 Linux \u955c\u50cf, \u90a3\u7edd\u5bf9\u662f\u4e2a\u5de8\u517d\uff0c\u81f3\u5c11\u76ee\u524d\u662f\u8d85\u8d8a\u6211\u7684\u60f3\u50cf\u529b\uff0c\u9664\u975e\u5f80\u91cc\u9762\u585e\u5165\u5927\u91cf\u7684\u4e1a\u52a1\u6570\u636e\u3002\u5173\u4e8e Lambda \u6709\u54ea\u4e9b\u9650\u5236\uff0c\u8bf7\u53c2\u9605 <a href=\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/gettingstarted-limits.html\">Lambda quotas<\/a>\u3002<br\/><br\/>\n\u4ecb\u7ecd\u5b8c Lambda \u5f15\u5165 Docker \u955c\u50cf\u7684\u80cc\u666f\u540e\uff0c\u672c\u6587\u63a5\u4e0b\u6765\u53ea\u5173\u6ce8\u5982\u4f55\u6784\u5efa\u4e00\u4e2a Python Lambda \u955c\u50cf\uff0c\u5bf9\u4e8e\u5982\u4f55\u90e8\u7f72 Docker \u5316\u7684 Lambda, \u4e0d\u5728\u672c\u6587\u7684\u8303\u56f4\u4e4b\u5185\u3002\u4e3b\u8981\u7684\u53c2\u8003\u6587\u6863\u4e3a AWS Lambda \u5b98\u65b9\u7684 <a href=\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/python-image.html\">Deploy Python Lambda functions with container images<\/a>."},{"title":"DynamoDB Stream \u5e94\u7528\u53ca\u89e6\u53d1 Lambda \u51fd\u6570","link":"https:\/\/yanbin.blog\/dynamodb-stream-and-trigger-lambda\/","pubDate":"Wed, 08 Sep 2021 23:27:13 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/dynamodb-stream-and-trigger-lambda\/","description":"\n<p>DynamoDB Stream \u7684\u5b9e\u8d28\u5c31\u662f\u4e00\u4e2a\u4f9d\u9644\u4e8e\u8868\u7684\u6d41\uff0c\u5bf9\u8868\u7684\u589e\u5220\u6539\u50cf\u5173\u7cfb\u578b\u6570\u636e\u7684\u89e6\u53d1\u5668\u4e00\u6837\uff0c\u4ee5\u65e5\u5fd7\u5f62\u5f0f\u6309\u987a\u8bb0\u5f55\u5230\u8be5\u6d41\u4e2d\u3002\u6211\u4eec\u53ef\u4ee5\u7528 API \u53bb\u8bfb\u53d6\u5176\u4e2d\u7684\u8bb0\u5f55\uff0c\u6216\u7528\u6765\u89e6\u53d1\u4e00\u4e2a Lambda\u3002DynamoDB Stream \u975e\u5e38\u7c7b\u4f3c\u4e8e Kinesis \u7684 Stream, \u5b83\u4eec\u90fd\u662f\u6709 Shard \u7684\u6982\u5ff5\uff0c\u4f46\u662f DynamoDB Stream \u7684 Shard \u6570\u76ee\u662f\u4e0d\u592a\u786e\u5b9a\u7684\u3002\u800c\u4e14\u8fd8\u80fd\u7528 KCL(Kinesis Client Library) \u6765\u64cd\u4f5c DynamoDB Stream\u3002<\/p>\n<p>DynamoDB Stream \u548c Kinesis Stream \u6709\u51e0\u4e2a\u901a\u7528\u7684 API \u64cd\u4f5c\uff0c\u50cf list_streams(), describe_stream(), get_shard_iterator() \u548c get_records() \u51fd\u6570\u3002\u540c\u65f6\u5462\uff0c\u5728\u8bbe\u7f6e Lambda \u7684\u89e6\u53d1\u5668\u65f6\uff0c\u9009\u62e9 DynamoDB Stream \u4e0e Kinesis Stream \u65f6\u53ef\u914d\u7f6e\u7684\u53c2\u6570\u51e0\u4e4e\u662f\u4e00\u6837\u7684\uff0c\u6709 Batch size, Batch window, Starting position \u4ee5\u53ca\u91cd\u8bd5\u7b56\u7565\u3002\u800c\u4e14\u4e5f\u662f\u4e00\u4e2a Shard \u53ea\u80fd\u540c\u65f6\u542f\u52a8\u4e00\u4e2a Lambda \u5b9e\u4f8b\uff0c\u7531\u4e8e DynamoDB Stream \u7684 Shard \u6570\u76ee\u4e0d\u592a\u786e\u5b9a\uff0c\u6240\u4ee5\u5b83\u80fd\u540c\u65f6\u542f\u52a8\u51e0\u4e2a Lambda \u5b9e\u4f8b\u4e5f\u4e0d\u786e\u5b9a\u7684\u3002<\/p>\n<p>\u53e6\u5916\uff0c \u4e00\u4e2a DynamoDB Stream \u53ea\u80fd\u6700\u591a\u88ab\u4e24\u4e2a Consumer \u6d88\u8d39\uff0c\u800c\u53ef\u7528\u6765\u6d88\u8d39 Kinesis Stream \u7684 Consumer \u6570\u76ee\u662f\u4e0d\u53d7\u9650\u7684\u3002DynamoDB Stream \u4e2d\u7684\u8bb0\u5f55\u4fdd\u5b58\u65f6\u95f4\u4e3a 24 \u5c0f\u65f6\uff0c Kinesis Stream \u4e2d\u8bb0\u5f55\u4fdd\u5b58\u65f6\u95f4\u4e5f\u662f\u53ef\u914d\u7f6e\u7684\u3002\u6211\u4eec\u521b\u5efa\u4e00\u4e2a DynamoDB \u8868\u65f6\u8fd8\u80fd\u542f\u7528 <code>Amazon Kinesis data stream details<\/code>, \u5373\u628a\u5bf9 DynamoDB \u7684\u64cd\u4f5c\u8bb0\u5f55\u76f4\u63a5\u53d1\u9001\u5230 Kinesis Stream \u4e2d\u53bb\uff0c\u8fd9\u6837\u5c31\u80fd\u64cd\u4f5c\u719f\u6089\u7684 Kinesis Stream\uff0cShard \u6570\u76ee\u53ef\u8bbe\u5b9a\uff0c\u574f\u5904\u5c31\u662f Kinesis Stream\u00a0\u8f83\u8d39\u94b1\u3002"},{"title":"AWS Python Lambda \u4f7f\u7528 Layer","link":"https:\/\/yanbin.blog\/aws-python-lambda-layer\/","pubDate":"Sat, 20 Jul 2019 21:33:27 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/aws-python-lambda-layer\/","description":"\n\u4f7f\u7528 Python \u4e66\u5199 AWS Lambda \u7684\u4e00\u4e2a\u597d\u5904\u5c31\u662f\u80fd\u591f\u5728\u63a7\u5236\u53f0\u4e2d\u76f4\u63a5\u7f16\u8f91\u6e90\u4ee3\u7801\uff0c\u975e\u5e38\u65b9\u4fbf\u8fdb\u884c\u5feb\u901f\u9a8c\u8bc1\u6d4b\u8bd5 AWS \u73af\u5883\u76f8\u5173\u7684\u3002\u8fd9\u53ea\u9650\u4e8e\u4f7f\u7528 AWS \u4e3a Python Lambda \u8fd0\u884c\u65f6\u63d0\u4f9b\u7684\u9ed8\u8ba4\u7ec4\u4ef6(\u6bd4\u5982 boto3)\uff0c\u5c1a\u82e5\u9700\u8981\u5728\u81ea\u5df1\u7684 Python Lambda \u4e2d\u4f7f\u7528\u5176\u4ed6\u7684\u7ec4\u4ef6(\u5982 redis), \u5c31\u4e0d\u5f97\u4e0d\u628a\u81ea\u5df1\u7684\u4ee3\u7801\u53ca\u4f9d\u8d56\u6253\u6210\u4e00\u4e2a zip \u5305\u518d\u90e8\u7f72\uff0c\u8fd9\u65f6\u5019\u5c31\u65e0\u6cd5\u5728\u63a7\u5236\u53f0\u76f4\u63a5\u7f16\u8f91\u4ee3\u7801\u4e86\uff0c\u4e5f\u53ea\u80fd\u5760\u5165\u672c\u5730\u4fee\u6539\u4ee3\u7801\uff0c\u91cd\u65b0\u6253\u5305\u4e0a\u4f20\u6d4b\u8bd5\u7684\u5faa\u73af\u5f53\u4e2d\u3002<br\/><br\/>\n\u6b32\u4e86\u89e3 Python Lambda \u4e2d\u9664\u4e86 boto3 \u5916\u8fd8\u80fd\u76f4\u63a5\u4f7f\u7528\u522b\u7684\u4ec0\u4e48\u7ec4\u4ef6\uff0c\u53ef\u70b9\u51fb\u6b64\u94fe\u63a5 <a href=\"https:\/\/gist.github.com\/gene1wood\/4a052f39490fae00e0c3\">https:\/\/gist.github.com\/gene1wood\/4a052f39490fae00e0c3<\/a> \u67e5\u770b\u5f53\u524d\u3002\u8be5 gist \u4e5f\u8fd8\u63d0\u4f9b\u4e86\u4ee3\u7801 <a href=\"https:\/\/gist.github.com\/gene1wood\/4a052f39490fae00e0c3#file-list_aws_lambda_modules-py\">code to run in Lambda<\/a> \u6765\u83b7\u5f97\u6240\u6709\u4f9d\u8d56\u3002\u8bd5\u4e86\u4e0b\u5728 Python Lambda \u4e2d\uff0c\u7528\u901a\u5e38\u7684<br\/>\n<blockquote>\nhelp('modules')\u00a0 \u00a0 # \u6216<br \/>\nhelp('modules package')\n<\/blockquote>\n\u7adf\u7136\u8fde\u5927\u540d\u9f0e\u9f0e\u7684 boto3\u00a0\u90fd\u65e0\u6cd5\u5217\u51fa\u6765\u3002<br\/><br\/>\n\u56de\u5230\u6b63\u9898\u6765\uff0c\u5982\u679c\u65e2\u60f3\u7528\u7b2c\u4e09\u65b9\u7684\u4f9d\u8d56\uff0c\u53c8\u60f3\u8981\u5728\u63a7\u5236\u53f0\u4e2d\u76f4\u63a5\u7f16\u8f91\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0c\u662f\u5426\u6709\u4ed6\u6cd5\u5462\uff1f\u6709\uff0c\u90a3\u5c31\u662f AWS \u5728 2018 \u5e74 11 \u6708\u63a8\u51fa\u7684 Lambda \u5c42\u3002\u89c1 <a href=\"https:\/\/aws.amazon.com\/about-aws\/whats-new\/2018\/11\/aws-lambda-now-supports-custom-runtimes-and-layers\/\">AWS Lambda Now Supports Custom Runtimes and Enables Sharing Common Code Between Functions<\/a>, \u8fd9\u91cc\u7684\u5c42\u9664\u4e86\u80fd\u7528\u6765\u63d0\u4f9b Python \u4f9d\u8d56\uff0c\u8fd8\u8bb8\u81ea\u5b9a\u4e49\u8fd0\u884c\u65f6\uff0c\u5982 C++ \u6216 Rust\u00a0\u7b49\u5199 Lambda \u90fd\u4e0d\u662f\u68a6\u3002<br\/><br\/>\nAWS \u7684\u670d\u52a1\u5c31\u50cf\u4e2a\u5927\u53e3\u888b\uff0c\u4f55\u65f6\u5077\u5077\u7684\u52a0\u6dfb\u4e86\u4ec0\u4e48\u670d\u52a1\uff0c\u6216\u51fa\u4e86\u4ec0\u4e48\u65b0\u7684\u6211\uff0c\u4e0d\u65f6\u5173\u6ce8\u5b83\u7684 <a href=\"https:\/\/aws.amazon.com\/new\/?whats-new-content-all.sort-by=item.additionalFields.postDateTime&amp;whats-new-content-all.sort-order=desc&amp;wn-featured-announcements.sort-by=item.additionalFields.numericSort&amp;wn-featured-announcements.sort-order=asc\">What's New with AWS<\/a> \u5fc5\u662f\u4e2a\u597d\u4e60\u60ef\u3002"},{"title":"Amazon SQS \u89e6\u53d1 AWS Lambda \u53ca\u91cd\u8bd5\/DLQ","link":"https:\/\/yanbin.blog\/amazon-sqs-trigger-aws-lambda\/","pubDate":"Tue, 02 Oct 2018 00:48:07 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/amazon-sqs-trigger-aws-lambda\/","description":"\n<p>Amazon\u00a0\u5728 2018\u00a0\u5e74 6\u00a0\u6708\u4efd\u5ba3\u5e03\u53ef\u4ee5\u8bbe\u7f6e\u7528 SQS\u00a0\u6765\u89e6\u53d1 Lambda\uff0cSQS\u00a0\u4e0d\u518d\u662f\u5355\u7eaf\u7528\u4e8e ECS\u00a0\u670d\u52a1\u4e2d\uff0c\u6216\u7528\u4e8e\u4f38\u7f29\u63a7\u5236\u7684\u3002\u8fd9\u513f\u5c31\u6765\u4eb2\u81ea\u5c1d\u8bd5\u4e00\u4e0b\u7528 SQS\u00a0\u9a71\u52a8\u7684\u00a0Lambda\uff0c\u4ee5\u53ca\u8981\u6ce8\u610f\u7684\u8981\u7d20\u3002<\/p>\n<p>\u9996\u5148\u4f7f\u7528 Java\u00a0\u7f16\u5199 Lambda\u00a0\u7684\u8bdd\uff0cAWS\u00a0\u5728 com.amazonaws:aws-lambda-java-events:2.20\u00a0\u7248\u672c\u5f00\u59cb\u52a0\u5165\u4e86\u00a0com.amazonaws.services.lambda.runtime.events.SQSEvent\u00a0\u7c7b\uff0c\u53ef\u662f\u8fd9\u4e2a\u7248\u672c\u7684 aws-lambda-java-events\u00a0\u662f\u6709\u6240\u9650\u7684\uff0c\u56e0\u4e3a <code>SQSEvent.SQSMessage<\/code>\u00a0\u7c7b\u662f\u79c1\u6709\u7684\uff0c\u8fd9\u5c31\u9020\u6210\u4e0d\u80fd\u83b7\u53d6\u5230 SQSEvent\u00a0\u4e2d\u7684\u8bb0\u5f55\u6570\u636e\u3002<\/p>\n<blockquote>\n<p>\/\/\u4e0b\u9762\u7684\u64cd\u4f5c\u4ee3\u7801\u65e0\u6cd5\u7f16\u8bd1\uff0c\u56e0\u4e3a SQSEvent.SQSMessage\u00a0\u662f\u79c1\u6709\u7684\uff0c\u4e0d\u53ef\u8bbf\u95ee<br \/>\nSQSEvent.SQSMessage sqs = sqsEvent.getRecords().get(0);\u00a0<br \/>\nsqsEvent.getRecords().get(0).getBody();<\/p>\n<\/blockquote>\n<p>Java\u00a0\u4f7f\u7528 SQS\u00a0\u6765\u9a71\u52a8 Lambda\u00a0\u7684\u8bdd\uff0c\u81f3\u5c11\u9700\u8981 com.amazonaws:aws-lambda-java-events:2.2.1\u00a0\u7248\u672c\uff0c\u4ece\u6b64 SQSEvent.SQSMessage\u00a0\u53d8\u6210 public\u00a0\u4e86\u3002\u8be5\u7248\u672c\u662f\u4e8e\u00a0 2018\u00a0\u5e74 6\u00a0\u6708\u4f20\u5230 Maven\u00a0\u5b98\u65b9\u4e2d\u592e\u4ed3\u5e93\u7684\uff0c\u8fd9\u5c31\u662f\u90a3\u65f6\u624d\u80fd\u771f\u6b63\u7528\u6765\u5199 Java\u00a0\u7684\u00a0SQS\u00a0\u89e6\u53d1\u7684 Lambda.<\/p>\n<p>\u540c\u65f6\u6b64\u7bc7\u4e5f\u662f\u4f5c\u4e3a\u4e0a\u6587\u00a0<a href=\"https:\/\/yanbin.blog\/aws-lambda-work-with-dlq\/\">AWS Lambda \u91cd\u8bd5\u4e0e\u6b7b\u4fe1\u961f\u5217(DLQ)<\/a>\u00a0\u7684\u4e00\u4e2a\u5f88\u91cd\u8981\u7684\u8865\u5145\u3002\u5728\u6b64\u4e5f\u4f1a\u9a8c\u8bc1 SQS\u00a0\u89e6\u53d1\u7684 Lambda\u00a0\u7684\u91cd\u8bd5\u673a\u5236\u4ee5\u53ca DLQ\u00a0\u76f8\u5173\u7684\u5185\u5bb9\u3002"},{"title":"AWS Lambda \u91cd\u8bd5\u4e0e\u6b7b\u4fe1\u961f\u5217(DLQ)","link":"https:\/\/yanbin.blog\/aws-lambda-work-with-dlq\/","pubDate":"Sun, 30 Sep 2018 23:46:43 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/aws-lambda-work-with-dlq\/","description":"\n<p>AWS Lambda\u00a0\u5141\u8bb8\u8bbe\u7f6e <code>Debugging and error handling<\/code>,\u00a0\u5728 Lambda\u00a0\u51fa\u73b0\u5f02\u5e38\uff0c\u8fbe\u5230\u6700\u5927\u7684\u91cd\u8bd5\u6b21\u6570\u540e\uff0c\u628a\u4ee5\u4e0b\u4fe1\u606f\u653e\u5230\u9009\u62e9\u7684 SNS\u00a0\u6216 SQS\u00a0\u4e3b\u9898\u4f5c\u4e3a\u6b7b\u4fe1\u961f\u5217(DLQ - Dead Letter Queue)\uff0c\u5305\u62ec<\/p>\n<ol>\n<li>\u539f\u59cb\u00a0Lambda\u00a0\u63a5\u6536\u5230\u7684\u6d88\u606f(\u57fa\u4e8e SNS\u00a0\u548c SQS\u00a0\u6d88\u606f\u7684\u603b\u5927\u5c0f\uff0c\u53ef\u80fd\u4f1a\u88ab\u622a\u53d6\uff0c\u672c\u4eba\u731c\u6d4b\uff0c\u5c24\u5176\u662f Kinesis\u00a0\u7684\u6d88\u606f\u4f1a\u6bd4\u8f83\u5927)<\/li>\n<li>\u539f\u59cb Lambda\u00a0\u7684 RequestId<\/li>\n<li>ErrorCode\uff08\u4e09\u4f4d\u6570\u5b57\u7684 HTTP\u00a0\u9519\u8bef\u7801\uff09<\/li>\n<li>ErrorMessage,\u00a0\u5373\u539f Lambda\u00a0\u629b\u51fa Exception\u00a0\u7684 getMessage()\u00a0\u4fe1\u606f\uff0c\u622a\u53d6 1\u00a0KB\u00a0\u5b57\u7b26\u4e32<\/li>\n<\/ol>\n<p>\u5e76\u4e14 Lambda\u00a0\u8981\u4f7f\u7528 DLQ\u00a0\u7684\u8bdd\u8fd8\u5fc5\u987b\u8bbe\u7f6e\u5f53\u524d Lambda\u00a0\u7684 IAM role\u00a0\u6709\u5bf9\u4e8e SNS\/SQS\u00a0\u4e3b\u9898\u76f8\u5e94\u7684 <code>sns:Publish<\/code>\u00a0\u548c <code>sqs:SendMessage<\/code>\u00a0\u6743\u9650\u3002<\/p>\n<p>AWS Lambda\u00a0\u57fa\u672c\u91cd\u8bd5\u89c4\u5219\uff1a\u5bf9\u4e8e Kinesis\u00a0\u6d88\u606f\u4f1a\u65e0\u9650\u91cd\u8bd5\u76f4\u81f3\u6d88\u606f\u8fc7\u671f\uff0c\u5bf9\u4e8e SNS\u00a0\u6216 SQS\u00a0\u7684\u6d88\u606f\u51fa\u73b0\u5f02\u5e38\u540e\u4f1a\u518d\u91cd\u8bd5\u4e24\u6b21\u3002\u53c2\u8003\uff1a<a href=\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/retries-on-errors.html\">AWS Lambda Retry Behavior<\/a>\u3002<\/p>\n<p>\u800c\u5728\u91cd\u8bd5\u6b21\u6570\u7528\u5b8c\u540e\u4ecd\u7136\u5931\u8d25\uff0c\u5e76\u4e14\u8bbe\u7f6e\u4e86 DLQ\u00a0\u7684\u8bdd\u5c31\u4f1a\u53d1\u9001\u6d88\u606f\u5230 DLQ\u00a0\u4e2d\u53bb\u3002"},{"title":"\u5982\u4f55\u5feb\u4e50\u7684\u4f7f\u7528 Java 8 \u7684 Lambda","link":"https:\/\/yanbin.blog\/happy-with-java8-lambda\/","pubDate":"Wed, 08 Aug 2018 23:45:05 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/happy-with-java8-lambda\/","description":"\n<p>Java 8\u00a0\u7684 Lambda\u00a0\u7279\u6027\u8f83\u4e4b\u4e8e\u5148\u524d\u7684\u6cdb\u578b\u52a0\u5165\u66f4\u80fd\u9f13\u821e\u4eba\u5fc3\u7684\uff0c\u6211\u5bf9 Lambda\u00a0\u7684\u7406\u89e3\u662f\u5b83\u5f97\u4ee5\u8ba9 Java\u00a0\u4ee5\u51fd\u6570\u5f0f\u601d\u7ef4\u7684\u65b9\u5f0f\u6765\u5199\u4ee3\u7801\u3002\u800c\u5199\u51fa\u7684\u4ee3\u7801\u662f\u5426\u662f\u51fd\u6570\u5f0f\uff0c\u5e76\u4e0d\u5355\u7eaf\u5728\u5305\u542b\u4e86\u591a\u5c11\u00a0Lambda\u00a0\u8868\u8fbe\u5f0f\uff0c\u800c\u5728\u601d\u7ef4\uff0c\u8981\u795e\u4f3c\u3002<\/p>\n<p>\u5b9e\u9645\u4e2d\u770b\u8fc7\u4e00\u4e9b\u4ee3\u7801\uff0c\u4e3a\u4e86\u00a0Lambda\u00a0\u8868\u8fbe\u5f0f\u800c\u00a0Lambda(\u51fd\u6570\u5f0f)\uff0c\u6709\u4e00\u79cd\u5c11\u5e74\u4e0d\u8bc6\u6101\u6ecb\u5473\uff0c\u4e3a\u8d4b\u65b0\u8bcd\u5f3a\u8bf4\u6101\u7684\u5473\u9053\u3002\u4ece\u800c\u81f4\u4f7f\u539f\u672c\u4e00\u4e2a\u7b80\u5355\u7684\u65b9\u8c03\u7528\u786c\u751f\u751f\u7684\u8981\u663e\u5f0f\u7684\u7528\u7c7b\u5982 <code>apply()<\/code>, <code>accept(obj)<\/code>\u00a0\u7b49\u5f62\u5f0f\u3002\u4e0d\u4ec5\u9020\u6210\u4ee3\u7801\u53ef\u8bfb\u6027\u5dee\uff0c\u4e14\u53ef\u6d4b\u8bd5\u6027\u4e5f\u53d8\u574f\u4e86\u3002<\/p>\n<p>\u4e3a\u4ec0\u4e48\u8bf4\u7684\u662f\u5feb\u4e50\u7684\u4f7f\u7528 Java 8\u00a0\u7684 Lambda\u00a0\u5462\uff1f\u6211\u7a83\u4ee5\u4e3a\u7b2c\u4e00\u4e2a\u5ff5\u5934\u58f0\u660e Lambda\u00a0\u8868\u8fbe\u5f0f\u4e3a\u5b9e\u4f8b\/\u7c7b\u53d8\u91cf(\u50cf\u672c\u6587\u7b2c\u4e00\u6bb5\u4ee3\u7801\u90a3\u6837)\uff0c\u800c\u4e0d\u662f\u65b9\u6cd5\u7684\uff0c\u4e00\u5b9a\u4f1a\u89c9\u5f97\u5982\u6b64\u4f7f\u7528\u65b9\u5f0f\u5f88\u5feb\u4e50\u7684\u3002\u6240\u8c13\u72ec\u4e50\u4e50\uff0c\u4e0d\u5982\u4f17\u4e50\u4e50\uff1b\u72ec\u4e50\u4e50\uff0c\u4f17\u4e0d\u4e50\u5b9a\u7136\u662f\u66f4\u5927\u7684\u5feb\u4e50;\u00a0\u66f4\u6781\u81f4\u4e00\u4e9b\uff0c\u4e0d\u7ba1\u4ec0\u4e48\u65f6\u5019\u5fc5\u987b\u662f\uff1a\u6211\u5feb\u4e50\uff0c\u6240\u4ee5\u4f60\u4e5f\u5feb\u4e50\u3002<\/p>\n<p>\u4e00\u65b9\u9762\u4e5f\u5728\u4e8e\u00a0Java\u00a0\u8fd8\u6ca1\u6709\u8fdb\u5316\u5230 JavaScript\u00a0\u6216\u00a0 Scala\u00a0\u90a3\u6837\u7684\u6c34\u5e73\uff0cJavaScript\u00a0\u7684\u51fd\u6570\u7c7b\u578b\u53d8\u91cf\uff0c\u4e0d\u4e00\u5b9a\u8981\u7528 <code>apply<\/code>\u00a0\u6216 <code>call<\/code>,\u00a0\u76f4\u63a5\u62ec\u53f7\u5c31\u80fd\u5b9e\u73b0\u65b9\u6cd5\u8c03\u7528\u3002Scala\u00a0\u7684\u51fd\u6570\u7c7b\u578b\u7528\u62ec\u53f7\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u5339\u914d\u5230 <code>apply<\/code>\u00a0\u6216 <code>update<\/code>\u00a0\u7b49\u65b9\u6cd5\u4e0a\u53bb\u3002"},{"title":"Java 8 \u6839\u636e\u5c5e\u6027\u503c\u5bf9\u5217\u8868\u53bb\u91cd","link":"https:\/\/yanbin.blog\/java-8-list-deduplication-with-lambda\/","pubDate":"Tue, 06 Feb 2018 21:39:55 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-list-deduplication-with-lambda\/","description":"\n<p>\u5bf9\u5217\u8868\u7684\u53bb\u91cd\u5904\u7406\uff0cJava 8\u00a0\u5728 <code>Stream<\/code>\u00a0\u63a5\u53e3\u4e0a\u63d0\u4f9b\u4e86\u7c7b\u4f3c\u4e8e SQL\u00a0\u8bed\u53e5\u90a3\u6837\u7684 <code>distinct()<\/code>\u00a0\u65b9\u6cd5\uff0c\u4e0d\u8fc7\u5b83\u4e5f\u53ea\u80fd\u57fa\u4e8e\u5bf9\u8c61\u6574\u4f53\u6bd4\u8f83\u6765\u53bb\u91cd\uff0c\u5373\u901a\u8fc7 equals\/hashCode\u00a0\u65b9\u6cd5\u3002<code>distinct<\/code>\u00a0\u65b9\u6cd5\u7684\u529f\u6548\u4e0e\u4ee5\u5f80\u7684 <code>new ArrayList(new HashSet(books))<\/code>\u00a0\u5dee\u4e0d\u591a\u3002\u7528\u8d77\u6765\u662f<\/p>\n<blockquote><br\/>\n<p>List&lt;Book&gt; unique = book.stream().distinct().collect(Collectors.toList())<\/p>\n<\/blockquote>\n<p>\u5e76\u4e14\u8fd9\u79cd\u53bb\u91cd\u65b9\u5f0f\u9700\u8981\u5728\u6a21\u578b\u7c7b\u4e2d\u540c\u65f6\u5b9e\u73b0 equals\u00a0\u548c hashCode\u00a0\u65b9\u6cd5\u3002<\/p>\n<p>\u56de\u5230\u5b9e\u9645\u9879\u76ee\u4e2d\u6765\uff0c\u6211\u4eec\u5f88\u591a\u65f6\u5019\u7684\u9700\u6c42\u662f\u8981\u6839\u636e\u5bf9\u8c61\u7684\u67d0\u4e2a\u5c5e\u6027\u6765\u53bb\u91cd\u3002\u6bd4\u5982\u63a5\u4e0b\u6765\u7684\u4e00\u4e2a\u5b9e\u4f8b\uff0c\u4e00\u4e2a books \u5217\u8868\u4e2d\u5b58\u5728 ID\u00a0\u4e00\u6837\uff0cname \u5374\u4e0d\u540c\u7684 book,\u00a0\u6211\u4eec\u8ba4\u4e3a\u8fd9\u662f\u91cd\u590d\u7684\uff0c\u6240\u4ee5\u9700\u8981\u6839\u636e book\u00a0\u7684 id\u00a0\u5c5e\u6027\u5bf9\u884c\u53bb\u91cd\u3002\u5728 collect\u00a0\u7684\u65f6\u5019\u7528\u5230\u7684\u65b9\u6cd5\u662f <code>collectinAndThen(...)<\/code>,\u00a0\u4e0b\u9762\u662f\u7b80\u5355\u4ee3\u7801:"},{"title":"\u4f53\u9a8c Scala 2.12 \u652f\u6301\u7684 Java 8 \u98ce\u683c(SAM) Lambda","link":"https:\/\/yanbin.blog\/scala-2-12-java-8-sam-lambda\/","pubDate":"Tue, 28 Nov 2017 23:27:34 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/scala-2-12-java-8-sam-lambda\/","description":"\n<p>\u4e0a\u4e00\u6b21\u5173\u6ce8 Scala\u00a0\u65b0\u7248\u672c\u7279\u6027\u8fd8\u662f\u5728\u5c06\u8fd1\u4e94\u5e74\u524d\uff0c\u9488\u5bf9\u7684\u662f\u00a0 Scala 2.10.\u00a0\u540e\u6765\u4e5f\u4e00\u76f4\u5728\u4f7f\u7528 Scala\uff0c\u57fa\u672c\u4e0a\u662f\u00a0Scala 2.11\uff0c\n\u4f46\u5bf9 Scala 2.11\u00a0\u6240\u5e26\u6765\u7684\u65b0\u7279\u6027\u57fa\u672c\u65e0\u77e5\uff0c\u5927\u7ea6\u6709\u4e2a Macro\u00a0\u529f\u80fd\uff0c\u6ca1\u4ec0\u4e48\u673a\u4f1a\u7528\u4e0a\uff0c\u5e94\u7528 sbt\u00a0\u65f6\u7a0d\u6709\u63a5\u89e6\u3002\u8fd8\u662f\u8001\u53e5\u8001\u8bdd\uff0c\n\u4e86\u89e3\u65b0\u7279\u6027\u6700\u53ef\u9760\u7684\u6587\u6863\u662f\u6bcf\u4e2a\u7248\u672c\u7684\u7684 Release Notes,\u00a0\u6bd4\u5982\n<a href=\"https:\/\/github.com\/scala\/scala\/releases\/v2.12.0\">Scala 2.12.0 Release Notes<\/a>.\n<\/p>\n<p>\u5176\u4e2d Scala 2.12\u00a0\u5e26\u6765\u7684\u4e3b\u8981\u7279\u6027\u5728\u4e8e\u5bf9 Java 8\u00a0\u7684\u5145\u5206\u652f\u6301\uff1a<\/p>\n<ol>\n<li>Scala\u00a0\u53ef\u4ee5\u6709\u65b9\u6cd5\u5b9e\u73b0\u7684 trait\u00a0\u76f4\u63a5\u7f16\u8bd1\u4e3a\u5e26\u9ed8\u8ba4\u65b9\u6cd5\u7684 Java\u00a0\u63a5\u53e3<\/li>\n<li>Lambda\u00a0\u8868\u8fbe\u5f0f\u65e0\u9700\u751f\u6210\u76f8\u5e94\u7684\u7c7b\uff0c\u800c\u662f\u7528\u5230 <code>invokedynamic<\/code>\u00a0\u5b57\u8282\u7801\u6307\u4ee4(\u8fd9\u4e2a\u662f Java 7\u00a0\u52a0\u8fdb\u6765\u7684\u65b0\u6307\u4ee4)<\/li>\n<li>\u6700\u65b9\u4fbf\u7684\u529f\u80fd\u83ab\u8fc7\u4e8e\u7ec8\u4e8e\u652f\u6301 Java\u00a0 8\u00a0\u98ce\u683c\u7684 Lambda\uff0c\u5373\u529f\u80fd\u6027\u63a5\u53e3\u7684 SAM(Single Abstract Method)<\/li>\n<\/ol>\n<h3>Scala\u00a0\u7684 Lambda\u00a0\u5185\u90e8\u5b9e\u73b0<\/h3>\n<p>\u8fd9\u513f\u4e3b\u8981\u662f\u4f53\u9a8c Scala 2.12\u00a0\u5982\u4f55\u4f7f\u7528 Java 8\u00a0\u98ce\u683c\u7684 Lambda.\u00a0\u5728 Scala 2.12\u00a0\u4e4b\u524d\uff0cScala\u00a0\u5bf9 Lambda\u00a0\u7684\u652f\u6301\u662f\u4e3a\u4f60\u51c6\u5907\u4e86\u4e00\u5927\u5806\u7684 trait \u7c7b\uff0c\u6709<\/p>\n<ol>\n<li>Function0, Function1, ...... Function22 (\u63a5\u6536\u591a\u4e2a\u53c2\u6570\uff0c\u8fd4\u56de\u4e00\u4e2a\u503c)<\/li>\n<li>Product1, Product2, ...... Product22 (\u51fd\u6570\u8fd4\u56de\u591a\u4e2a\u503c\uff0c\u5373 TupleX\u00a0\u65f6\u7528\u7684)<\/li>\n<\/ol>"},{"title":"Terraform \u8fdb\u9636 - \u90e8\u7f72 Lambda \u5e76\u521b\u5efa\u76f8\u5173\u8d44\u6e90","link":"https:\/\/yanbin.blog\/terraform-deploy-lambda-create-resources\/","pubDate":"Mon, 28 Aug 2017 02:46:00 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/terraform-deploy-lambda-create-resources\/","description":"\n\u6628\u65e5\u521a\u521a\u4f53\u9a8c\u4e86 Terraform \u662f\u4e00\u4e2a\u4ec0\u4e48\u9b3c\u4e1c\u897f\u00a0<a href=\"https:\/\/yanbin.blog\/terraform-get-started-with-first-sample\/\">Terraform \u4f7f\u7528 - \u4ece\u6700\u7b80\u5355\u4f8b\u5b50\u5f00\u59cb<\/a>\uff0c\u4eca\u5929\u518d\u8fdb\u4e00\u6b65\u3002\u5c06\u6765\u5c1d\u8bd5\u7684\u662f\u4f7f\u7528 Terraform \u6765\u90e8\u7f72\u4e00\u4e2a Lambda \u5e94\u7528\uff0c\u5e76\u521b\u5efa\u76f8\u5173\u7684\u8d44\u6e90\u3002<\/p>\n<br\/>\n\u672c\u4f8b\u4e2d\u7684 Lambda \u8981\u7531 Kinesis \u6765\u89e6\u53d1\uff0c\u5e76\u5199\u6570\u636e\u5230 S3 Bucket \u4e2d\u53bb\uff0c\u6240\u4ee5\u9700\u8981\u505a\u7684\u4e8b\u60c5\u5927\u81f4\u5982\u4e0b\uff1a<br\/>\n<ol>\n<li>\u521b\u5efa IAM Role, \u8be5 Role \u8981\u80fd\u8bbf\u95ee S3, Kinesis \u548c CloudWatch<\/li>\n<li>\u521b\u5efa\u4e00\u4e2a Kinesis Stream (\u6307\u5b9a Shard \u6570\u76ee)<\/li>\n<li>\u521b\u5efa\u4e00\u4e2a S3 Bucket<\/li>\n<li>\u90e8\u7f72 Lambda (\u8981\u6307\u5b9a\u80fd\u8bbf\u95ee S3 Bucket \u7684 Role, \u5e76\u5176\u4ed6\u53c2\u6570\uff0c\u5982\u73af\u5883\u53d8\u91cf)<\/li>\n<li>\u8bbe\u7f6e Lambda \u7684 Kinesis \u89e6\u53d1\u5668 (\u6307\u5b9a\u6e90 Kinesis Stream \u548c \u00a0batchSize)<\/li>\n<\/ol>\n<br\/>\n\u4ee5\u4e0b\u662f Lambda \u7684\u5b9e\u73b0\u4ee3\u7801\uff0c\u4ece Kinesis \u8bfb\u51fa\u5b57\u7b26\u4e32\uff0c\u9017\u53f7\u5206\u5272\uff0c\u7b2c\u4e00\u90e8\u5206\u4f5c\u4e3a S3 Key, \u7b2c\u4e8c\u90e8\u5206\u4f5c\u4e3a\u6587\u4ef6\u5185\u5bb9\u5199\u5165\u5230 S3 Bucket \u4e2d\u53bb\u3002S3 Bucket \u540d\u79f0\u4ece\u73af\u5883\u53d8\u91cf\u4e2d\u8bfb\u53d6\u3002"},{"title":"AWS Lambda \u6309\u5e8f\u5904\u7406\u540c\u4e00\u4e2a Kinesis Shard \u4e2d\u7684\u6d88\u606f","link":"https:\/\/yanbin.blog\/aws-lambda-consume-messages-from-one-share-in-series\/","pubDate":"Fri, 19 May 2017 02:56:06 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/aws-lambda-consume-messages-from-one-share-in-series\/","description":"\n\u5f53 AWS Lambda \u7531 Kinesis \u6d88\u606f\u6765\u89e6\u53d1\u65f6\uff0c\u4e00\u4e2a Kinesis Shard \u4f1a\u76f8\u5e94\u542f\u52a8\u4e00\u4e2a Lambda \u5b9e\u4f8b\uff0c\u6bd4\u5982\u8bf4 Kinesis Stream \u6709 5 \u4e2a Shards, \u90a3\u540c\u65f6\u53ea\u4f1a\u542f\u52a8 5 \u4e2a Lambda \u5b9e\u4f8b\u3002\u90a3\u4e48\u628a\u591a\u6761\u6d88\u606f\u53d1\u9001\u5230\u540c\u4e00\u4e2a Kinesis Shard \u4e2d\u53bb\uff0c\u8fd9\u4e9b\u6d88\u606f\u4f1a\u88ab\u5982\u4f55\u6d88\u8d39\u5462\uff1f\u7b54\u6848\u662f\u6309\u987a\u6d88\u606f\uff0c\u4e0d\u7ba1\u8fd9\u4e9b\u6d88\u606f\u662f\u5426\u88ab\u4e0d\u540c\u7684 Lambda \u5b9e\u4f8b\u5904\u7406\u3002\u672c\u6587\u5c31\u662f\u5173\u4e8e\u600e\u4e48\u53bb\u7406\u89e3 <a href=\"https:\/\/aws.amazon.com\/lambda\/faqs\/\">https:\/\/aws.amazon.com\/lambda\/faqs\/<\/a>\u00a0\u7684\u4e0b\u9762\u90a3\u6bb5\u8bdd\u7684\u5185\u5bb9\uff1a<\/p>\n<blockquote>\n<b>Q: How does AWS Lambda process data from Amazon Kinesis streams and Amazon DynamoDB Streams?<br \/>\nAWS Lambda \u5982\u4f55\u5904\u7406\u6765\u81ea\u4e8e Amazon Kinesis \u548c DynamoDB \u7684\u6570\u636e<\/b>\nThe Amazon Kinesis and DynamoDB Streams records sent to your AWS Lambda function are strictly serialized, per shard. This means that if you put two records in the same shard, Lambda guarantees that your Lambda function will be successfully invoked with the first record before it is invoked with the second record. If the invocation for one record times out, is throttled, or encounters any other error, Lambda will retry until it succeeds (or the record reaches its 24-hour expiration) before moving on to the next record. The ordering of records across different shards is not guaranteed, and processing of each shard happens in parallel.\n\u4ece Kinesis \u548c DynamoDB \u5355\u4e2a Shard \u4e0a\u7684\u8bb0\u5f55\u4f1a\u88ab Lambda \u4e25\u683c\u7684\u6309\u5e8f\u5904\u7406\u3002\u8fd9\u610f\u5473\u7740\u5982\u679c\u4f60\u9001\u4e24\u6761\u8bb0\u5f55\u5230\u76f8\u540c\u7684 Shard, Lambda \u5c06\u4f1a\u4fdd\u8bc1\u7b2c\u4e00\u6761\u8bb0\u5f55\u6210\u529f\u5904\u7406\u540e\u624d\u4f1a\u5904\u7406\u7b2c\u4e8c\u6761\u8bb0\u5f55\u3002\u5047\u5982\u5904\u7406\u7b2c\u4e00\u6761\u8bb0\u5f55\u65f6\u8d85\u65f6\uff0c\u6216\u8d85\u8fc7\u8d44\u6e90\u4f7f\u7528\u4e0a\u9650\uff0c\u6216\u78b0\u5230\u4efb\u4f55\u9519\u8bef\uff0c Lambda \u5c06\u4f1a\u4e0d\u65ad\u91cd\u8bd5\u76f4\u5230\u6210\u529f(\u6216\u8bb0\u5f55\u5728 24 \u5c0f\u65f6\u540e\u8fc7\u671f), \u800c\u540e\u624d\u4f1a\u53bb\u5904\u7406\u4e0b\u4e00\u6761\u8bb0\u5f55\u3002\u8de8 Shard \u7684\u8bb0\u5f55\u4e0d\u4fdd\u8bc1\u5230\u8fbe\u987a\u5e8f\uff0c\u4e14\u662f\u5e76\u884c\u5904\u7406\u591a\u4e2a Shard \u6765\u7684\u8bb0\u5f55\u3002\n<\/blockquote>\n\u53ef\u4ee5\u505a\u51e0\u4e2a\u8bd5\u9a8c\uff0c\u4e0b\u9762\u7684\u4ee3\u7801\u53ef\u4ee5\u4fdd\u8bc1\u6d88\u606f\u603b\u662f\u88ab\u53d1\u9001\u5230\u540c\u4e00\u4e2a Kinesis Shard\uff0c\u56e0\u4e3a PartitionKey \u53c2\u6570\u662f\u4e00\u4e2a\u5e38\u91cf"},{"title":"AWS Java Lambda \u4e0e\u73af\u5883\u53d8\u91cf","link":"https:\/\/yanbin.blog\/aws-java-lambda-environment-variable\/","pubDate":"Tue, 28 Mar 2017 00:15:28 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/aws-java-lambda-environment-variable\/","description":"\n<span style=\"color: #0000ff;\">\u4e00\u53e5\u8bdd\u6982\u8981\uff1a\u5bf9 Lambda \u73af\u5883\u53d8\u91cf\u7684\u4efb\u4f55\u6539\u52a8\u90fd\u4f1a\u5f15\u8d77\u4e00\u6b21 Lambda \u7684\u51b7\u542f\u52a8\uff0c\u5927\u53ef\u653e\u5fc3\u5728 handleRequest(...) \u65b9\u6cd5\u5916\u4f7f\u7528\u73af\u5883\u53d8\u91cf\u3002<\/span><\/p>\n<br\/>\n\u4ece <a href=\"http:\/\/unmi.cc\/aws-java-lambda-keys\/\">AWS \u4e0a Java Lambda \u5e94\u7528\u8bb0\u8981 \u4e2d<\/a>\uff0c\u6211\u5b66\u5230\u4e86 Lambda \u7684\u5b9e\u4f8b\u662f\u8de8\u8bf7\u6c42\u5171\u4eab\u7684\uff0c\u6240\u4ee5\u4e3a\u4f7f\u7528 Lambda \u914d\u7f6e\u7684\u73af\u5883\u53d8\u91cf\u65f6\u66fe\u5199\u51fa\u4e86\u4e0b\u9762<strong>\u590d\u6742\u800c\u591a\u4f59<\/strong>\u7684\u00a0 AWS\u00a0 Lambda \u4ee3\u7801:<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">Handler<\/span><span class=\"w\"> <\/span><span class=\"kd\">implements<\/span><span class=\"w\"> <\/span><span class=\"n\">RequestHandler<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">SNSEvent<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">private<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">threadPoolSize<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">getThreadPoolSizeFromEnv<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">private<\/span><span class=\"w\"> <\/span><span class=\"n\">ExecutorService<\/span><span class=\"w\"> <\/span><span class=\"n\">threadPool<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">Executors<\/span><span class=\"p\">.<\/span><span class=\"na\">newFixedThreadPool<\/span><span class=\"p\">(<\/span><span class=\"n\">threadPoolSize<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nd\">@Override<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"nf\">handleRequest<\/span><span class=\"p\">(<\/span><span class=\"n\">SNSEvent<\/span><span class=\"w\"> <\/span><span class=\"n\">snsEvent<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">Context<\/span><span class=\"w\"> <\/span><span class=\"n\">context<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">configuredThreadPoolSize<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">getThreadPoolSizeFromEnv<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"n\">configuredThreadPoolSize<\/span><span class=\"w\"> <\/span><span class=\"o\">!=<\/span><span class=\"w\"> <\/span><span class=\"n\">threadPoolSize<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">threadPoolSize<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">configuredThreadPoolSize<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">threadPool<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">Executors<\/span><span class=\"p\">.<\/span><span class=\"na\">newFixedThreadPool<\/span><span class=\"p\">(<\/span><span class=\"n\">threadPoolSize<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">14<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;Hello Lambda&#34;<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">15<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">16<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">17<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">private<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"nf\">getThreadPoolSizeFromEnv<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">18<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">Integer<\/span><span class=\"p\">.<\/span><span class=\"na\">parseInt<\/span><span class=\"p\">(<\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">getenv<\/span><span class=\"p\">().<\/span><span class=\"na\">getOrDefault<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;threadpool_size&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;50&#34;<\/span><span class=\"p\">));<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">19<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">20<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n\u8fd9\u6bb5\u4ee3\u7801\u770b\u8d77\u6765\u5f88\u5728\u7406\uff0c\u65e2\u7136 Lambda \u5b9e\u4f8b\u662f\u5171\u4eab\u7684\uff0c\u90a3\u4e48\u5728\u5fc5\u53d8\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u5c31\u53ef\u80fd\u4e0d\u4f1a\u91cd\u65b0\u521d\u59cb\u59cb\u5316\u5b9e\u4f8b\uff0c\u6240\u4ee5\u5728\u6bcf\u6b21\u7684\u8bf7\u6c42\u65b9\u6cd5\u4e2d\u5bf9\u6bd4\u5982\u679c\u73af\u5883\u53d8\u91cf\u503c\u6539\u52a8\u4e86\u5c31\u91cd\u65b0\u7528\u6700\u65b0\u7684\u914d\u7f6e\u503c\u6765\u521d\u59cb\u5316\u7ebf\u7a0b\u6c60\u3002\u7136\u800c\u4e0a\u9762\u7684\u4ee3\u7801\u7ed3\u7ed3\u5b9e\u5b9e\u662f\u591a\u4f59\u7684\uff0c\u771f\u662f\u628a Lambda \u60f3\u5f97\u592a\u7b80\u5355\u4e86\uff0c\u5982\u679c\u662f\u5f88\u591a\u73af\u5883\u53d8\u91cf\u5c82\u4e0d\u662f\u9010\u4e00\u5224\u65ad\u3002"},{"title":"AWS Java Lambda \u4f7f\u7528 Logback \u8bb0\u5f55\u65e5\u5fd7","link":"https:\/\/yanbin.blog\/aws-java-lambda-use-logback\/","pubDate":"Sat, 18 Mar 2017 02:46:05 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/aws-java-lambda-use-logback\/","description":"\n\u76f4\u63a5\u4e00\u53e5\u8bdd\uff1a\u53bb\u6389 Log4J \u7684\u4f9d\u8d56\uff0c\u628a\u00a0 Slf4J, Logback, \u548c log4j-over-slf4j \u4f9d\u8d56\u52a0\u8fdb\u6765\u5c31\u884c\u4e86\uff0c\u914d\u7f6e\u6587\u4ef6\u6362\u6210 logback.xml\uff0c\u8fd9\u5c31\u5b8c\u4e86\uff0c\u4e0d\u8981\u5f80\u4e0b\u770b\u4e86\uff0c\u90fd\u662f\u4e9b\u5e9f\u8bdd\u3002<\/p>\n\u5f53\u6211\u4eec\u7528 <a href=\"https:\/\/serverless.com\/\">Serverless<\/a> \u547d\u4ee4 <code>sls create -t aws-java-maven -p hello-lambda<\/code> \u521b\u5efa\u7684\u793a\u4f8b\u9879\u76ee\u4e2d\u76f4\u63a5\u7528\u7684\u662f Log4J \u65e5\u5fd7\u7ec4\u4ef6\uff0c\u800c\u4e14\u4e5f\u6ca1\u7528\u50cf\u00a0 Slf4j, \u6216 Apache Common Logging \u66f4\u4e0a\u4e00\u5c42\u7684\u901a\u7528\u65e5\u5fd7\u6846\u67b6\u3002\u67e5\u770b\u4e86\u51e0\u4e2a AWS \u672c\u8eab\u7684\u7ec4\u4ef6 S3, SNS, \u548c Kinesis \u7684 SDK, \u5b83\u4eec\u5185\u90e8\u662f\u7528\u7684 Apache Common Logging \u58f0\u660e\u7684\u65e5\u5fd7\u53d8\u91cf<br\/>\n<blockquote>\nimport org.apache.commons.logging.LogFactory;<br \/>\nimport org.apache.commons.logging.Logger;<br \/>\n<br \/>\nprivate static final Log log = LogFactory.getLog(AmazonKinesis.class)\n<\/blockquote>\n\u800c\u6211\u4eec\u81ea\u5df1\u7684\u7ec4\u4ef6\u4e2d\u901a\u7528\u65e5\u5fd7\u7ec4\u4ef6\u662f Slf4j, \u5e95\u5c42\u5b9e\u73b0\u4e3a Logback, \u6240\u4ee5\u6211\u4eec\u5e0c\u671b\u5728 Lambda \u4e2d\u4f7f\u7528 Logback \u6765\u5199\u65e5\u5fd7\u3002<br\/>\n\u9009\u7528\u4e00\u4e2a\u901a\u7528\u65e5\u5fd7\u6846\u67b6\u603b\u662f\u660e\u667a\u4e4b\u4e3e\uff0c\u56e0\u4e3a\u4e00\u4e2a\u9879\u76ee\u7ecf\u5e38\u6742\u7cc5\u4e86\u591a\u79cd\u65e5\u5fd7\u5b9e\u73b0\uff0c\u4f7f\u7528 Slf4J \u6216 Apache Common Logging \u53ef\u4ee5\u628a\u5b83\u4eec(Log4J, Logback, \u6216\u66f4\u591a)\u8f93\u51fa\u5230\u5171\u540c\u7684\u76ee\u7684\u5730\uff0c\u5e76\u4e14\u6709\u7edf\u4e00\u7684\u65e5\u5fd7\u8f93\u51fa\u63a5\u53e3\u3002\u800c\u6211\u4eec\u8ba4\u4e3a\u901a\u7528\u65e5\u5fd7\u6846\u67b6\u8fd8\u662f Slf4J \u8981\u5148\u8fdb\u4e9b\uff0c\u6240\u4ee5\u6211\u4eec\u5728 Java Lambda \u4e2d\u7684\u65e5\u5fd7\u65b9\u6848\u662f Slf4J + Logback\uff0c\u8fd8\u9700\u8981\u628a Log4J \u7684\u65e5\u5fd7\u6865\u63a5\u5230 Slf4J \u4e0a\u6765\uff0c\u518d\u7ecf\u7531 Logback \u8f93\u51fa\u3002<br\/><br\/>\n\u56de\u5230\u524d\u9762\u521b\u5efa\u7684 <code>hello-lambda<\/code> \u9879\u76ee\uff0c\u770b\u5176\u4e2d\u600e\u4e48\u7528\u7684 Log4J\uff0c\u5148\u77a7\u77a7 <code>pom.xml<\/code> \u6587\u4ef6\u600e\u4e48\u5f15\u5165\u7684 Log4J, \u5b83\u662f\u95f4\u63a5\u901a\u8fc7\u4e00\u4e2a AWS \u5b9a\u4e49\u7684 Log4J Appender \u5f15\u5165\u7684"},{"title":"AWS \u4e0a Java Lambda \u5e94\u7528\u8bb0\u8981","link":"https:\/\/yanbin.blog\/aws-java-lambda-keys\/","pubDate":"Thu, 16 Mar 2017 01:06:25 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/aws-java-lambda-keys\/","description":"\nAWS \u7684 Lambda \u7ed9\u4e86\u90a3\u4e9b\u4e0d\u60f3\u81ea\u5df1\u7ba1\u7406 EC2 \u670d\u52a1\u5668\u548c\u914d\u7f6e\u8d1f\u8f7d\u4eba\u5458\u5f88\u5927\u7684\u4fbf\u5229\uff0c\u6240\u4ee5 Lambda \u88ab\u63cf\u8ff0\u4e3a Serverless\u3002\u771f\u6b63\u7684\u53ea\u5173\u6ce8\u4e1a\u52a1\u5c31\u884c\uff0c\u600e\u4e48\u8c03\u5ea6\uff0c\u540c\u65f6\u6709\u591a\u5c11\u4e2a\u5b9e\u4f8b\u8fd0\u884c\u4ea4\u7ed9\u4e9a\u9a6c\u900a\u53bb\u5904\u7406\u5c31\u662f\u4e86\u3002\u8fd0\u884c Lambda \u7684\u73af\u5883\u4e5f\u662f\u4e9a\u9a6c\u900a\u5185\u90e8\u7684 EC2 \u670d\u52a1\u5668\uff0c\u955c\u50cf\u662f Amazon Linux, \u6240\u4ee5\u5982\u679c\u60f3\u8fd0\u884c\u7cfb\u7edf\u547d\u4ee4\uff0c\u90a3\u662f Linux \u7684\u3002Lambda \u652f\u6301\u591a\u79cd\u8bed\u8a00 Node.js, Python, C#(.net core), \u8fd8\u6709 Java 8\uff0c\u6211\u4eec\u5c31\u9009\u62e9\u4e86 Java 8, \u4e00\u5f00\u59cb\u8fd8\u62c5\u5fc3\u5b83\u4e0e\u522b\u7684\u8bed\u8a00\u6bd4\u8d77\u6765\u4f1a\u591a\u5927\u52a3\u52bf\uff0c\u5176\u5b9e\u4e0d\u7136\u3002\u800c\u4e14\u6240\u8c13\u7684 Java 8, \u5e76\u975e\u5355\u6307 Java \u8bed\u8a00\uff0c\u800c\u662f\u6307 JVM \u5e73\u53f0\uff0c\u6240\u4ee5\u4e5f\u53ef\u4ee5\u7528 Scala, Clojure, Groovy, Kotlin \u6765\u5199\u3002<br\/><br\/>\nJava \u4e0e\u811a\u672c\u8bed\u8a00\u5982 Node.js, Python \u76f8\u6bd4\u7ed9\u4eba\u4e00\u4e2a\u660e\u663e\u7684\u611f\u89c9\u662f\u542f\u52a8\u6162\uff0c\u8fd8\u6709\u4eba\u7528\u7edf\u8ba1\u6570\u636e\u6765\u6bd4\u5212 <a href=\"https:\/\/github.com\/berezovskyi\/lambda-test\">AWS Lambda cold start(pseudeo-)benchmark<\/a>. \u4e0d\u8fc7\u771f\u4e0d\u7528\u62c5\u5fc3\uff0c\u4eba\u5bb6\u8bf4\u7684\u662f\u51b7\u542f\u52a8\uff0c\u4e5f\u5c31\u53d1\u751f\u5728\u90e8\u7f72\u540e\u7b2c\u4e00\u6b21\u6267\u884c\u542f\u52a8\u4f1a\u6bd4\u8f83\u6162\u3002\u8981\u662f\u6211\u4eec\u7684 Lambda \u7ecf\u5e38\u88ab\u8c03\u7528\uff0c\u6216\u6bcf\u5929\u89e6\u53d1\u6bd4\u8f83\u96c6\u4e2d\uff0cLambda \u5728\u4efb\u52a1\u5230\u6765\u4e4b\u524d\u5904\u7406\u5f85\u7eed\u72b6\u6001\uff0c\u5c31\u4e0d\u4f1a\u6709\u51b7\u542f\u52a8\u7684\u8017\u65f6\u8fc7\u7a0b\u3002\u6216\u8005\u662f\u6bcf\u6b21\u4efb\u52a1\u8981\u6267\u884c 3 \u5206\u949f\u5de6\u53f3\uff0c\u53c8\u4f55\u5fc5\u5728\u4e4e\u6beb\u79d2\u7ea7\u7684\u51b7\u542f\u52a8\u65f6\u95f4\u3002<br\/><br\/>\n\u8bf4\u5230\u5e95\u5c31\u662f\u522b\u7406\u4f1a\u4e0b\u9762\u7684\u6570\u636e<br\/>\n<blockquote>\n<ul>\n<li><del>20ms startup time for Python ~ $0.041675<\/del><\/li>\n<li><del>40ms startup time for Node.js ~ $0.08335<\/del><\/li>\n<li><del>80ms startup time for Java ~ $0.1667<\/del><\/li>\n<\/ul>\n<\/blockquote>\n<h3>Lambda \u5b9e\u4f8b\u91cd\u7528<\/h3>\nJava \u7684 Lambda \u5c31\u662f\u4e00\u4e2a\u5fae\u670d\u52a1\uff0c\u5728\u9996\u6b21\u89e6\u53d1\u65f6\u5fae\u670d\u52a1\u51b7\u542f\u52a8\u6709\u4e9b\u6162\uff0c\u4f46\u4e00\u65e6\u542f\u52a8\u4e4b\u540e\u5c31\u53ef\u4ee5\u7528\u8fd9\u4e2a\u5fae\u670d\u52a1\u5b9e\u4f8b\u63a5\u53d7\u540e\u7eed\u7684\u8bf7\u6c42\uff0c\u53ea\u6709\u5728\u6bd4\u8f83\u957f\u7684\u4e00\u6bb5\u65f6\u95f4\u5185\u672a\u88ab\u89e6\u53d1 AWS \u624d\u4f1a\u628a\u8fd9\u4e2a\u5fae\u670d\u52a1\u6740\u6389\u3002"},{"title":"Java8 Lambda \u8868\u8fbe\u5f0f\u4e0e Checked Exception","link":"https:\/\/yanbin.blog\/java8-lambda-and-checked-exception\/","pubDate":"Wed, 08 Feb 2017 23:54:38 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java8-lambda-and-checked-exception\/","description":"\n\u5f53\u6211\u4eec\u5728\u4f7f\u7528 Java 8 \u7684 Lambda \u8868\u8fbe\u5f0f\u65f6\uff0c\u8868\u8fbe\u5f0f\u5185\u5bb9\u9700\u8981\u629b\u51fa\u5f02\u5e38\uff0c\u4e5f\u8bb8\u8fd8\u4f1a\u60f3\u5f53\u7136\u7684\u8ba9\u5f53\u524d\u65b9\u6cd5\u518d\u5f80\u5916\u629b\u6765\u89e3\u51b3\u7f16\u8bd1\u95ee\u9898\uff0c\u5982\u4e0b\u9762\u7684\u4ee3\u7801\n<br\/>\n<img class=\"aligncenter post-image\"\nsrc=\"https:\/\/yanbin.blog\/posts\/2017\/java8-lambda-and-checked-exception\/java-lambda-exception-1.png\"\nwidth=\"383px\"\n\/>\n\u8ba9 <code>main()<\/code>\u00a0\u65b9\u6cd5\u629b\u51fa <code>Exception<\/code>\u00a0\u8fd8\u662f\u4e0d\u89e3\u51b3\u51b3\u7f16\u8bd1\u9519\u8bef\uff0c\u4ecd\u7136\u63d0\u793a \"Unhandled exception: java.io.FileNotFoundException\"\u3002<br\/><br\/>\n\u56e0\u4e3a\u6211\u4eec\u53ef\u80fd\u4fdd\u6301\u7740\u60ef\u6027\u601d\u7ef4\uff0c\u5ffd\u7565\u4e86 Lambda \u672c\u8eab\u5c31\u662f\u4e00\u4e2a\u529f\u80fd\u6027\u63a5\u53e3\u65b9\u6cd5\u7684\u5b9e\u73b0\uff0c\u6240\u4ee5\u628a\u4e0a\u9762\u7684\u4ee3\u7801\u8fd8\u539f\u4e3a\u533f\u540d\u7c7b\u7684\u65b9\u5f0f<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">foo<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Stream<\/span><span class=\"p\">.<\/span><span class=\"na\">of<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;a&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;b&#34;<\/span><span class=\"p\">).<\/span><span class=\"na\">forEach<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">Consumer<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nd\">@Override<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">accept<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">s<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">FileInputStream<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span><span class=\"p\">).<\/span><span class=\"na\">close<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">7<\/span><span class=\"cl\"><span class=\"p\">});<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u90a3\u4e48\u5bf9\u4e8e\u4e0a\u9762\u90a3\u79cd\u60c5\u51b5\u5e94\u8be5\u5982\u4f55\u5904\u7406\u5462\uff1f"},{"title":"Java 8 \u8fd4\u56de\u96c6\u5408\u4e2d\u7b2c\u4e00\u4e2a\u5339\u914d\u7684\u5143\u7d20","link":"https:\/\/yanbin.blog\/java-8-return-the-first-match-element\/","pubDate":"Thu, 17 Dec 2015 01:10:52 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-return-the-first-match-element\/","description":"\n\u5728 Java 8 \u4e4b\u524d\u5982\u679c\u6211\u4eec\u8981\u627e\u5230\u96c6\u5408\u4e2d\u7b2c\u4e00\u4e2a\u5339\u914d\u5143\u7d20\uff0c\u8981\u4f7f\u7528\u5916\u90e8\u5faa\u73af\uff0c\u5982\u4e0b\u9762\u65b9\u6cd5 findFirstMatch() \u5982\u679c\u627e\u5230\u4e00\u4e2a\u5927\u4e8e 3 \u7684\u6570\u5b57\u7acb\u5373\u8fd4\u56de\u5b83\uff0c\u5426\u5219\u8fd4\u56de null<\/p>\n<blockquote>\n\u00a0 public Integer findFirstMatch() {<br \/>\n\u00a0\u00a0\u00a0 List&lt;Integer&gt; integers = Arrays.asList(1, 4, 2, 5, 6, 3);<br \/>\n\u00a0\u00a0\u00a0 for(int i: integers) {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0 if(i &gt; 3) return i;<br \/>\n\u00a0\u00a0\u00a0 }<br \/>\n\u00a0\u00a0\u00a0 return null;<br \/>\n\u00a0 }\n<\/blockquote>\n\u56e0\u4e3a\u5728 for \u5faa\u73af\u4e2d\u627e\u5230\u7b2c\u4e00\u4e2a\u5927\u4e8e 3 \u7684\u6570\u5b57\u662f 4, \u5e76\u4e14\u7acb\u5373\u8fd4\u56de\uff0c\u6240\u4ee5\u4e0d\u7ba1\u96c6\u5408 integers \u518d\u5927\uff0c\u4e5f\u4e0d\u4f1a\u904d\u5386\u6574\u4e2a\u96c6\u5408\u3002<br\/><br\/>\n\u6ce8\uff1a\u4e0d\u8981\u7ea0\u7ed3\u4e8e\u4e0a\u9762\u793a\u4f8b\u65b9\u6cd5\u7684\u5b9e\u9645\u7528\u9014\uff0c\u5b9e\u9645\u4e0a\u96c6\u4f53\u548c\u5339\u914d\u6761\u4ef6\u90fd\u8be5\u901a\u8fc7\u53c2\u6570\u4f20\u5165\u65b9\u6cd5\u7684\uff0c\u8fd9\u91cc\u53ea\u4f5c\u6f14\u793a\u5faa\u73af\u3002<br\/><br\/>\n\u90a3\u4e48\u6211\u4eec\u6765\u5230 Java 8 \u4e4b\u540e\u7528 Stream API \u8be5\u5982\u4f55\u5b9e\u73b0\uff0c\u7ffb\u904d\u4e86 Stream API, \u80fd\u8fc7\u6ee4\u5143\u7d20\u7684\u64cd\u4f5c\u4e5f\u5c31\u662f filter \u65b9\u6cd5\uff0c\u4e8e\u662f\u5c1d\u8bd5\u8fd9\u6837\u7684\u5199\u6cd5"},{"title":"Java 8 Lambda \u6355\u83b7\u5916\u90e8\u53d8\u91cf","link":"https:\/\/yanbin.blog\/java-8-lambda-capture-outer-variables\/","pubDate":"Fri, 11 Dec 2015 23:30:51 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-lambda-capture-outer-variables\/","description":"\n\u53ef\u80fd\u4f1a\u628a\u6355\u83b7\u5916\u90e8\u53d8\u91cf\u7684 Lambda \u8868\u8fbe\u5f0f\u79f0\u4e3a\u95ed\u5305\uff0c\u90a3\u4e48 Java 8 \u7684 Lambda \u53ef\u4ee5\u6355\u83b7\u4ec0\u4e48\u53d8\u91cf\u5462\uff1f<\/p>\n<br\/>\n<ol>\n<li>\u6355\u83b7\u5b9e\u4f8b\u6216\u9759\u6001\u53d8\u91cf\u662f\u6ca1\u6709\u9650\u5236\u7684(\u53ef\u8ba4\u4e3a\u662f\u901a\u8fc7 final \u7c7b\u578b\u7684\u5c40\u90e8\u53d8\u91cf this \u6765\u5f15\u7528\u524d\u4e24\u8005)<\/li>\n<li>\u6355\u83b7\u7684\u5c40\u90e8\u53d8\u91cf\u5fc5\u987b\u663e\u5f0f\u7684\u58f0\u660e\u4e3a <em>final<\/em> \u6216\u5b9e\u9645\u6548\u679c\u7684\u7684 <em>final<\/em> \u7c7b\u578b<\/li>\n<\/ol>\n<br\/>\n\u56de\u987e\u4e00\u4e0b\u6211\u4eec\u5728 Java 8 \u4e4b\u524d\uff0c\u533f\u540d\u7c7b\u4e2d\u5982\u679c\u8981\u8bbf\u95ee\u5c40\u90e8\u53d8\u91cf\u7684\u8bdd\uff0c\u90a3\u4e2a\u5c40\u90e8\u53d8\u91cf\u5fc5\u987b\u663e\u5f0f\u7684\u58f0\u660e\u4e3a\u00a0 final\uff0c\u4f8b\u5982\u4e0b\u9762\u7684\u4ee3\u7801\u653e\u5728 Java 7 \u4e2d\u662f\u7f16\u8bd1\u4e0d\u8fc7\u7684<br\/>\n<a href=\"https:\/\/yanbin.blog\/posts\/2015\/java-8-lambda-capture-outer-variables\/java7-annymous-capture-local-variable.png\" target=\"_blank\" rel=\"noreferrer\">\n<img class=\"aligncenter post-image\"\nsrc=\"https:\/\/yanbin.blog\/posts\/2015\/java-8-lambda-capture-outer-variables\/java7-annymous-capture-local-variable-800x358.png\"\nwidth=\"500px\"\n\/>\n<\/a>\nJava 7 \u8981\u6c42 version \u8fd9\u4e2a\u5c40\u90e8\u53d8\u91cf\u5fc5\u987b\u662f final\u00a0 \u7c7b\u578b\u7684\uff0c\u5426\u5219\u5728\u533f\u540d\u7c7b\u4e2d\u4e0d\u53ef\u5f15\u7528\u3002"},{"title":"Java 8 Lambda \u5199\u6cd5\u4e0e\u7b80\u5316","link":"https:\/\/yanbin.blog\/java-8-lambda-simple-ways\/","pubDate":"Mon, 07 Dec 2015 23:06:21 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-lambda-simple-ways\/","description":"\nJava 8 \u7684 Lambda \u8868\u8fbe\u5f0f\u7684\u5b9e\u73b0\u65b9\u5f0f\u8fd8\u662f\u57fa\u4e8e\u5df2\u6709\u7684\u5b57\u8282\u7801\u6307\u4ee4\uff0c\u7531 Lambda \u8868\u8fbe\u5f0f\u7684\u65b9\u6cd5\u7b7e\u540d\u7ed3\u5408\u4e0a\u4e0b\u6587\u5e76\u7ecf\u7531 SAM \u63a8\u65ad\u51fa\u6b63\u786e\u7684\u7c7b\u578b\u6765\u3002Java 8 \u7684 Lambda \u5b8c\u6574\u4e66\u5199\u683c\u5f0f\u662f<\/p>\n<br\/>\n<code>(type parameter1 [type parameter2, ...type parametern]) -&gt; { statements here }<\/code><br\/><br\/>\n\u8fd9\u79cd\u6807\u51c6\u683c\u5f0f\u6240\u8868\u793a\u7684\u5c31\u662f\u65b9\u6cd5\u7b7e\u540d\u3002<br\/><br\/>\n\u867d\u4e0d\u53ca\u5176\u4ed6\u8bed\u8a00\u7684 Lambda \u8868\u8fbe\u5f0f\uff0c\u50cf Swift, Scala \u53ef\u7701\u7565\u53c2\u6570\u90e8\u5206\uff0c\u53ef\u7528\u9ed8\u8ba4\u53c2\u6570\u540d <code>$0<\/code>, <code>$1<\/code>, \u6216 <code>_<\/code>, \u4f46 Java 8 \u7684 Lambda \u8fd8\u662f\u53ef\u4ee5\u8fdb\u884c\u914c\u60c5\u7b80\u5316<br\/>\n<ol>\n<li>\u53c2\u6570\u7c7b\u578b\u603b\u662f\u53ef\u7701\u7565 \u00a0 -- \u00a0 \u00a0 <code>(x, y) -&gt; { x + y; }<\/code><\/li>\n<li>\u53c2\u6570\u4e3a\u4e00\u4e2a\u65f6\uff0c\u53c2\u6570\u62ec\u53f7\u53ef\u7701\u7565\u00a0 -- \u00a0\u00a0 <code>x -&gt; { System.out.println(x); }<\/code><\/li>\n<li>\u8bed\u53e5\u4e3a\u4e00\u6761\u65f6\uff0c\u53ef\u7701\u7565\u5927\u62ec\u53f7, \u5e76\u4e14\u8bed\u53e5\u540e\u4e0d\u8981\u5206\u53f7 --\u00a0 <code>x -&gt; System.out.println(x)<\/code><\/li>\n<li>\u4e0a\u9762\u66f4\u8fdb\u4e00\u6b65\uff0c\u5982\u679c\u662f\u5355\u6761 return \u8bed\u53e5\uff0c\u5fc5\u987b\u628a return \u5173\u952e\u5b57\u53bb\u6389\u00a0 --\u00a0 <code>x -&gt; \"Hello \" + x<\/code><\/li>\n<li>\u5c31\u5dee\u4e00\u70b9\uff0c\u53c2\u6570\u90e8\u5206\u603b\u662f\u4e0d\u80fd\u7701\uff0c\u65e0\u53c2\u5fc5\u987b\u5199\u6210 <code>() -&gt; System.out.println(\"hi\")<\/code><\/li>\n<li>Java 8 \u4e2d\u82e5\u8981\u8fd1\u4f3c\u7684\u5b9e\u73b0\u65e0\u53c2\u6570\u90e8\u5206\u5199\u6cd5\uff0c\u90a3\u5c31\u662f\u65b9\u6cd5\u5f15\u7528\u4e86 -- <code>System.out::println<\/code><\/li>\n<\/ol>"},{"title":"JDK8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u7406\u89e3\u65b0\u5f0f\u96c6\u5408\u64cd\u4f5c","link":"https:\/\/yanbin.blog\/jdk8-lambda-collection-operations\/","pubDate":"Tue, 25 Mar 2014 03:11:11 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk8-lambda-collection-operations\/","description":"\n\u6709\u4e86\u524d\u9762\u7684 SAM\uff0cLambda \u8868\u8fbe\u5f0f\uff0c\u4ee5\u53ca\u9ed8\u8ba4\u63a5\u53e3\u65b9\u6cd5\u4f5c\u94fa\u57ab\u540e\uff0c\u6211\u4eec\u53ef\u4ee5\u53bb\u5f88\u597d\u7684\u53bb\u7406\u89e3 Java8 \u7528 Lambda \u00a0\u8868\u8fbe\u5f0f\u64cd\u4f5c\u96c6\u5408\u7684\u57fa\u672c\u539f\u7406\u4e86\u3002\u6b64\u7bc7\u6211\u4eec\u60f3\u8981\u5316\u89e3\u7684\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kn\">package<\/span><span class=\"w\"> <\/span><span class=\"nn\">cc.unmi<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.util.Arrays<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.util.Collection<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.util.List<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.util.stream.Collectors<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"cm\">\/**\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"cm\"> * @author Unmi\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"cm\"> *\/<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">TestJava8Collection<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span><span class=\"w\"> <\/span><span class=\"n\">args<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Collection<\/span><span class=\"w\"> <\/span><span class=\"n\">collection<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">Arrays<\/span><span class=\"p\">.<\/span><span class=\"na\">asList<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;abc&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;cde&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;efg&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">14<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">List<\/span><span class=\"w\"> <\/span><span class=\"n\">list<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">collection<\/span><span class=\"p\">.<\/span><span class=\"na\">stream<\/span><span class=\"p\">().<\/span><span class=\"na\">filter<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"na\">contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;c&#34;<\/span><span class=\"p\">)).<\/span><span class=\"na\">collect<\/span><span class=\"p\">(<\/span><span class=\"n\">Collectors<\/span><span class=\"p\">.<\/span><span class=\"na\">toList<\/span><span class=\"p\">());<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">15<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"na\">forEach<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">));<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">16<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">17<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u5982\u679c\u5bf9\u5176\u4ed6\u652f\u6301\u95ed\u5305\u7684\u8bed\u8a00\uff0c\u5982 JavaScript, Groovy, Ruby, Scala \u7b49\u6709\u6240\u4e86\u89e3\u7684\u8bdd\uff0c\u5f88\u5bb9\u6613\u770b\u51fa\u524d\u9762\u7684\u4ee3\u7801\u8f93\u51fa\u4e3a<br\/>\n<blockquote>\nabc<br \/>\ncde"},{"title":"JDK8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u9ed8\u8ba4\u548c\u9759\u6001\u63a5\u53e3\u65b9\u6cd5","link":"https:\/\/yanbin.blog\/jdk8-lambda-default-static-interface-methods\/","pubDate":"Tue, 25 Mar 2014 01:41:50 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk8-lambda-default-static-interface-methods\/","description":"\n<p>\u8fdb\u5165 Java8 \u4e4b\u540e\u6211\u4eec\u4f1a\u53d1\u73b0\u63a5\u53e3\u53ef\u4ee5\u6709\u65b9\u6cd5\u5b9e\u73b0\u4e86\uff0c\u8fd9\u4e0e\u6211\u4eec\u4e00\u76f4\u770b\u5f85 Java \u63a5\u53e3\u7684\u89c2\u5ff5\u4ea7\u751f\u4e86\u51b2\u7a81\uff0c\u4e0d\u8fc7\u4e5f\u522b\u6025\uff0c\u63a5\u53e3\u4e2d\u7684\u65b9\u6cd5\u5b9e\u73b0\u5fc5\u987b\u662f\u4e00\u4e2a\u9ed8\u8ba4\u65b9\u6cd5\uff0c\u5373\u50cf<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kd\">interface<\/span> <span class=\"nc\">Shape<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">default<\/span><span class=\"w\"> <\/span><span class=\"kt\">boolean<\/span><span class=\"w\"> <\/span><span class=\"nf\">isShape<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"kc\">true<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n\u672c\u6587\u65e8\u5728\u63a2\u8ba8 Java8 \u7684\u9ed8\u8ba4\u63a5\u53e3\u65b9\u6cd5\u5b58\u5728\u7684\u5408\u7406\u6027\uff0cJava8 \u5728\u8fd9\u70b9\u4e0a\u5982\u4f55\u4fdd\u6301\u4e0e\u524d\u9762\u7248\u672c\u7684\u517c\u5bb9\u6027\u3002<br\/><br\/>\nLambda \u548c\u65b9\u6cd5\u5f15\u7528\u4f7f\u5f97 Java \u8bed\u8a00\u66f4\u5177\u8868\u73b0\u529b\u3002\u8bf4\u5230 Lambda \u548c\u65b9\u6cd5\u5f15\u7528\u7684\u5173\u7cfb\uff0cLambda \u8868\u8fbe\u5f0f\u7684\u76ee\u7684\u5c31\u662f\u8ba9\u4f60\u66f4\u4e3a\u4fbf\u6377\u7684\u53bb\u7ed5\u8fc7\u5bf9\u8c61\u76f4\u63a5\u5f15\u7528\u65b9\u6cd5\u3002<br\/><br\/>\n\u63a5\u53e3\u5e94\u8be5\u662f\u76f8\u5bf9\u7a33\u56fa\u7684\uff0c\u6211\u4eec\u5e94\u8be5\u6709\u8fd9\u6837\u7684\u7ecf\u9a8c\uff0c\u7c7b\u4e2d\u4f7f\u7528\u4e86\u63a5\u53e3\u4e2d\u5b9a\u4e49\u7684\u5e38\u91cf\uff0c\u5982\u679c\u5728\u63a5\u53e3\u4e2d\u6539\u53d8\u4e86\u8be5\u5e38\u91cf\u503c\uff0c\u5355\u7eaf\u7684\u66ff\u6362\u63a5\u53e3\u5bf9\u5e94\u7684 class \u6587\u4ef6\u662f\u4e0d\u594f\u6548\u7684\uff0c\u56e0\u4e3a\u7f16\u8bd1\u7c7b\u65f6\u5176\u5b9e\u662f\u628a\u63a5\u53e3\u4e2d\u7684\u5e38\u91cf\u76f4\u63a5\u56fa\u5316\u5728\u7c7b\u4e2d\u4e86\u3002\u5982\u679c\u7c7b\u4e2d\u8981\u4f53\u73b0\u51fa\u6700\u65b0\u5e38\u91cf\u503c\uff0c\u90a3\u4e48\u4f7f\u7528\u63a5\u53e3\u7684\u7c7b\u4e5f\u8981\u91cd\u65b0\u7f16\u8bd1\u3002\u5373\u4f7f\u5728\u63a5\u53e3\u4e2d\u6dfb\u52a0\u6216\u6539\u53d8\u4e86\u65b9\u6cd5\u5b9a\u4e49\uff0c\u4e5f\u4e0d\u80fd\u5f3a\u5236\u4f7f\u7528\u5230\u5b83\u7684\u7c7b\u91cd\u65b0\u7f16\u8bd1\uff0c\u65e9\u5148\u7684\u7c7b\u5b8c\u5168\u53ef\u4ee5\u81ea\u7531\u7684\u8fd0\u884c\uff0c\u56e0\u4e3a\u63a5\u53e3\u4e2d\u5b9a\u4e49\u7684\u5e38\u91cf\u548c\u65b9\u6cd5\u7684\u6240\u6709\u5185\u5bb9\u90fd\u5728\u81ea\u8eab\uff0c\u7c7b\u4e00\u65e6\u7f16\u8bd1\u540e\u4fbf\u53ef\u8131\u79bb\u6240\u5b9e\u73b0\u7684\u63a5\u53e3\u800c\u8fd0\u8f6c\u3002"},{"title":"JDK8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u65b9\u6cd5\u5f15\u7528","link":"https:\/\/yanbin.blog\/jdk8-lambda-method-references\/","pubDate":"Thu, 17 Oct 2013 08:15:52 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk8-lambda-method-references\/","description":"\nLambda \u5141\u8bb8\u6211\u4eec\u5b9a\u4e49\u533f\u540d\u65b9\u6cd5(\u5373\u90a3\u4e2a Lambda \u8868\u8fbe\u5f0f\uff0c\u6216\u53eb\u95ed\u5305)\uff0c\u4f5c\u4e3a\u4e00\u4e2a\u529f\u80fd\u6027\u63a5\u53e3\u7684\u5b9e\u4f8b\u3002\u5982\u679c\u4f60\u4e0d\u60f3\u628a\u4e00\u4e2a Lambda \u8868\u8fbe\u5f0f\u5199\u5f97\u8fc7\u5927\uff0c\u90a3\u4e48\u4f60\u53ef\u4ee5\u628a\u8868\u8fbe\u5f0f\u7684\u5185\u5bb9\u5206\u79bb\u51fa\u6765\u5199\u5728\u4e00\u4e2a\u65b9\u6cd5\u4e2d\uff0c\u7136\u540e\u5728\u653e\u7f6e Lambda \u8868\u8fbe\u5f0f\u7684\u4f4d\u7f6e\u4e0a\u586b\u4e0a\u5bf9\u90a3\u4e2a\u65b9\u6cd5\u7684\u5f15\u7528\u3002<\/p>\n<br\/>\n\u65b9\u6cd5\u5f15\u7528\u4e5f\u5e94\u770b\u4f5c\u662f\u4e00\u4e2a Lambda \u8868\u8fbe\u5f0f\uff0c\u6240\u4ee5\u5b83\u4e5f\u9700\u8981\u4e00\u4e2a\u660e\u786e\u7684\u76ee\u6807\u7c7b\u578b\u5145\u5f53\u529f\u80fd\u6027\u63a5\u53e3\u7684\u5b9e\u4f8b\u3002\u7b80\u5355\u8bf4\u5c31\u662f\u88ab\u5f15\u7528\u7684\u65b9\u6cd5\u8981\u4e0e\u529f\u80fd\u63a5\u53e3\u7684 SAM(Single Abstract Method) \u53c2\u6570\u3001\u8fd4\u56de\u7c7b\u578b\u76f8\u5339\u914d\u3002\u65b9\u6cd5\u5f15\u7528\u7684\u5f15\u5165\u907f\u514d\u4e86 Lambda \u5199\u590d\u6742\u4e86\u53ef\u8bfb\u6027\u7684\u95ee\u9898\uff0c\u4e5f\u4f7f\u5f97\u903b\u8f91\u66f4\u6e05\u6670\u3002<br\/><br\/>\n\u4e3a\u4e86\u5e94\u5bf9\u65b9\u6cd5\u5f15\u7528\u8fd9\u4e00\u6982\u5ff5\uff0c JDK8 \u53c8\u91cd\u65b0\u501f\u7528\u4e86 C++ \u7684\u90a3\u4e2a \u201c::\u201d \u57df\u64cd\u4f5c\u7b26\uff0c\u5168\u79f0\u4e3a\u4f5c\u7528\u57df\u89e3\u6790\u64cd\u4f5c\u7b26\u3002<br\/><br\/>\n\u4e0a\u9762\u7684\u8868\u8ff0\u4e5f\u8bb8\u4e0d\u597d\u660e\u767d\uff0c\u6211\u770b\u5b98\u65b9\u7684\u90a3\u4efd State of the Lambda \u4e5f\u89c9\u5f97\u4e0d\u600e\u4e48\u5bb9\u6613\u7406\u89e3\uff0c\u7279\u522b\u662f\u5b83\u4e3e\u4e86\u90a3\u4e2a\u4f8b\u5b50\u5f88\u96be\u8ba9\u4eba\u671b\u6587\u751f\u610f\u3002\u6211\u7528\u4e2a\u81ea\u5df1\u5199\u7684\u4f8b\u5b50\u6765\u8bf4\u660e\u4e00\u4e0b\u5427\u3002<br\/><br\/>\n\u76ee\u524d\u7684 Eclipse-JDK8 \u7248\u8fd8\u4e0d\u80fd\u652f\u6301\u65b9\u6cd5\u5f15\u7528\u7684\u7279\u6027\uff0c\u5e78\u597d\u5c31\u662f\u5728\u6628\u5929\u6b63\u5f0f\u7248\u7684 NetBeans IDE 7.4 \u5bf9 JDK8 \u6709\u4e86\u8f83\u597d\u7684\u652f\u6301\uff0c\u6240\u4ee5\u5728 NetBeans 7.4 \u4e2d\u5199\u6d4b\u8bd5\u4ee3\u7801\u3002"},{"title":"JDK8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u8bcd\u6cd5\u8303\u56f4\u548c\u53d8\u91cf\u6355\u83b7","link":"https:\/\/yanbin.blog\/jdk8-lambda-lexical-scoping-variable-capture\/","pubDate":"Wed, 16 Oct 2013 08:35:23 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk8-lambda-lexical-scoping-variable-capture\/","description":"\nLambda \u8868\u8fbe\u5f0f\u7684\u8bcd\u6cd5\u8303\u56f4\uff0c\u4e00\u8a00\u4ee5\u853d\u4e4b\u5c31\u662f\u6ca1\u6709\u5f15\u5165\u65b0\u7684\u8bcd\u6cd5\u8303\u56f4\u3002\u8fd9\u91cc\u7684\u8bcd\u6cd5\u8303\u56f4\u8981\u7814\u7a76\u7684\u8bfe\u9898\u662f this \u7684\u6307\u5411\u6709\u6ca1\u6709\u5728\u53d8\u3002\u6211\u4eec\u77e5\u9053\u5728\u533f\u540d\u7c7b\u5185\u90e8 this \u6307\u5411\u7684\u533f\u540d\u7c7b\u7684\u5b9e\u4f8b\uff0c\u8fd9\u79cd\u5173\u7cfb\u662f\u5728\u7f16\u8bd1\u671f\u5c31\u786e\u5b9a\u7684\u3002\u800c\u5728 Lambda \u8868\u8fbe\u5f0f\u4e2d\u7684 this \u4e0e\u5916\u90e8\u7684 this \u6ca1\u6709\u5dee\u522b\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u53ef\u4ee5\u628a Lambda \u8868\u8fbe\u5f0f\u5f53\u6210\u4e00\u822c\u7684\u8bed\u53e5\u6765\u770b\u5f85\uff0c\u591a\u7b80\u5355\u554a\uff0c\u4e0d\u50cf JavaScript \u4e2d\u7684 this \u88ab\u641e\u7684\u90a3\u4e48\u9b54\u5e7b\u3002<\/p>\n<br\/>\n\u53ef\u4ee5\u8fd9\u4e48\u6d4b\u8bd5\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">foo<\/span><span class=\"p\">(){<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Arrays<\/span><span class=\"p\">.<\/span><span class=\"na\">asList<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Unmi&#34;<\/span><span class=\"p\">).<\/span><span class=\"na\">forEach<\/span><span class=\"p\">((<\/span><span class=\"n\">s<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">));<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u8f93\u51fa\u7684\u662f\u540c\u4e00\u4e2a\u5730\u5740\u91cc\u7684\u4e1c\u897f\uff1a<br\/><br\/>\n<span style=\"color: #800000;\">cc.unmi.testjdk8.TestLambda@28a418fc<\/span><br \/>\n<span style=\"color: #800000;\">cc.unmi.testjdk8.TestLambda@28a418fc<\/span><br\/><br\/>\n\u63a5\u4e0b\u6765\u77a7\u77a7 Lambda \u8868\u8fbe\u5f0f\u5bf9\u5916\u5c42\u53d8\u91cf\u7684\u6355\u83b7\u3002Lambda \u8868\u8fbe\u5f0f\u7684\u6709\u4e2a\u597d\u5904\u5c31\u662f\u5b83\u662f\u8f7b\u91cf\u7ea7\uff0c\u53ef\u91cd\u7528\u5355\u5143\uff0c\u5e76\u4e14\u53ef\u6355\u83b7\u5916\u5c42\u53d8\u91cf\u3002"},{"title":"JDK8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u7c7b\u578b\u63a8\u65ad","link":"https:\/\/yanbin.blog\/jdk8-lambda-4-type-inference\/","pubDate":"Tue, 15 Oct 2013 09:00:43 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk8-lambda-4-type-inference\/","description":"\n\u73b0\u5728\u6211\u4eec\u6765\u770b\u770b JDK8 \u662f\u600e\u4e48\u5bf9 Lambda \u8868\u8fbe\u5f0f\u8fdb\u884c\u7c7b\u578b\u63a8\u65ad\u7684\uff0cLambda \u7684\u5b9e\u9645\u7c7b\u578b\u53eb\u505a\u5b83\u7684\u76ee\u6807\u7c7b\u578b(target type)\uff0c\u56e0\u4e3a JDK8 \u6cbf\u627f\u4e86\u5df2\u6709\u7684\u7c7b\u578b\u7cfb\u7edf\uff0c\u6240\u4ee5\u8c61\u8fd9\u6837\u7684\u5199\u6cd5\uff1a<br\/>\n<br\/>\n<span style=\"color: #800000;\">button.addActionListener(<span style=\"color: #0000ff;\">(ActionEvent e) -&gt; foo()<\/span>);<\/span><br\/>\n<br\/>\naddActionListener() \u65b9\u6cd5\u63a5\u6536\u7684\u662f\u4e00\u4e2a ActionListener \u7c7b\u578b\u7684\u53c2\u6570\uff0c\u6240\u4ee5\u8fd9\u91cc\u7684 Lambda \u8868\u8fbe\u5f0f<span style=\"color: #800000;\"> (ActionEvent e) -&gt; foo()<\/span> \u4ee3\u8868\u7684\u5c31\u662f\u4e00\u4e2a ActionListener \u5b9e\u4f8b\uff0c\u7f16\u8bd1\u5668\u662f\u600e\u4e48\u77e5\u9053\u8fd9\u4e00\u70b9\u7684\uff0c\u800c\u4e14\u76f8\u540c\u7684 Lambda \u662f\u53ef\u4ee5\u8868\u793a\u4e0d\u540c\u7684\u7c7b\u578b\u7684\uff0c\u89c1\uff1a<br\/>\n<br\/>\n<span style=\"color: #800000;\">Callable&lt;String&gt; c = <span style=\"color: #0000ff;\">() -&gt; \"done\"<\/span>;<\/span>&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: #800000;\">\/\/\u8fd9\u4e2a () -&gt; \"done\" \u662f Callable&lt;String&gt; \u7c7b\u578b<\/span><br\/>\n<span style=\"color: #800000;\">PrivilegedAction&lt;String&gt; a = <span style=\"color: #0000ff;\">() -&gt; \"done\"<\/span>;&nbsp; \/\/\u540c\u6837\u7684 () -&gt; \"done\" \u5374\u662f PrivilegedAction&lt;String&gt; \u7c7b\u578b<\/span><br\/>\n<br\/>\n\u7b54\u66f0\uff0c\u6839\u636e Lambda \u8868\u8fbe\u5f0f\u6240\u5904\u7684\u4e0a\u4e0b\u6587\u53bb\u611f\u77e5\u3002\u4e0a\u4e0b\u6587\u51b3\u5b9a\u4e86 Lambda \u6240\u671f\u76fc\u7684\u7c7b\u578b\uff0c\u6bd4\u5982\u8bf4\u53d8\u91cf\u58f0\u660e\u7c7b\u578b\uff0c\u65b9\u6cd5\u8981\u6c42\u7684\u8f93\u5165\u53c2\u6570\u7c7b\u578b\uff0c\u6240\u4ee5\u5b83\u5fc5\u987b\u662f\u660e\u786e\uff0c\u4e0d\u80fd\u6a21\u68f1\u4e24\u53ef\u3002\u6240\u4ee5\u4e00\u4e2a Lambda \u8868\u8fbe\u5f0f\u80fd\u5426\u653e\u5728\u67d0\u5904\u9700\u8981\u6ee1\u8db3\u4ee5\u4e0b\u51e0\u4e2a\u6761\u4ef6\uff1a<br\/>\n<ol>\n<li><span style=\"color: #ff0000;\"><strong>\u671f\u76fc\u7684\u7c7b\u578b\u5fc5\u987b\u662f\u4e00\u4e2a\u529f\u80fd\u6027\u63a5\u53e3\uff0c\u8fd9\u6837\u5c31\u80fd\u552f\u4e00\u5b9a\u4f4d\u5230\u90a3\u4e2a\u62bd\u8c61\u65b9\u6cd5\u4e0a\u53bb\uff0c\u786e\u5b9a\u65b9\u6cd5\u7b7e\u540d<\/strong><\/span>\uff0c\u63a5\u4e0b\u6765\u5c31\u662f"},{"title":"JDK8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u5b9e\u73b0\u539f\u7406\u521d\u63a2","link":"https:\/\/yanbin.blog\/jdk8-lambda-3-inside\/","pubDate":"Sun, 13 Oct 2013 08:28:11 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk8-lambda-3-inside\/","description":"\nJDK8 \u4f7f\u7528\u4e00\u884c Lambda \u8868\u8fbe\u5f0f\u53ef\u4ee5\u4ee3\u66ff\u5148\u524d\u7528\u533f\u540d\u7c7b\u4e94\u516d\u884c\u4ee3\u7801\u6240\u505a\u7684\u4e8b\u60c5\uff0c\u90a3\u4e48\u5b83\u662f\u600e\u4e48\u5b9e\u73b0\u7684\u5462\uff1f\u4ece\u6240\u5468\u77e5\uff0c\u533f\u540d\u7c7b\u4f1a\u5728\u7f16\u8bd1\u7684\u65f6\u5019\u751f\u6210\u4e0e\u5bbf\u4e3b\u7c7b\u5e26\u4e0a $1, $2 \u7684\u7c7b\u6587\u4ef6\uff0c\u5982\u5199\u5728 TestLambda \u4e2d\u7684\u533f\u540d\u7c7b\u4ea7\u751f\u6210\u7c7b\u6587\u4ef6\u662f TestLambda$1.class, TestLambda$2.class \u7b49\u3002<\/p>\n<br\/>\n\u6211\u8bd5\u9a8c\u4e86\u4e00\u4e0b\uff0c\u5982\u679c\u4f7f\u7528\u7684\u662f Lambda \u8868\u8fbe\u5f0f\u5e76\u4e0d\u4f1a\u751f\u6210\u989d\u5916\u7684\u7c7b\u6587\u4ef6\uff0c\u90a3\u4e48\u5b57\u8282\u7801\u91cc\u662f\u4ec0\u4e48\u6837\u5b50\u7684\uff1f\u6765\u770b\u4e0b\u7528\u00a0 javap -c \u53cd\u7f16\u8bd1\u51fa\u4e0b\u9762\u6587\u4ef6\u4ea7\u751f\u7684 TestLambda.class\uff0c\u4e24\u4e2a\u65b9\u6cd5\uff0c\u4e00\u4e2a\u662f\u00a0 byAnonymousClass() \u4f7f\u7528\u533f\u540d\u7c7b\uff0c\u53e6\u4e00\u4e2a\u662f byLambda \u4f7f\u7528 Lambda \u7684\u65b9\u5f0f\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\"> 1<\/span><span class=\"cl\"><span class=\"kn\">package<\/span><span class=\"w\"> <\/span><span class=\"nn\">cc.unmi.testjdk8<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 2<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.awt.event.ActionEvent<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 4<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.awt.event.ActionListener<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 5<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 6<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">javax.swing.JButton<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 7<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">TestLambda<\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">private<\/span><span class=\"w\"> <\/span><span class=\"n\">JButton<\/span><span class=\"w\"> <\/span><span class=\"n\">button<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">JButton<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">byLambda<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">button<\/span><span class=\"p\">.<\/span><span class=\"na\">addActionListener<\/span><span class=\"p\">((<\/span><span class=\"n\">ActionEvent<\/span><span class=\"w\"> <\/span><span class=\"n\">e<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"o\">-&amp;<\/span><span class=\"n\">gt<\/span><span class=\"p\">;<\/span><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Lambda&#34;<\/span><span class=\"p\">));<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">13<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">14<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">15<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">byAnonymousClass<\/span><span class=\"p\">(){<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">16<\/span><span class=\"cl\"><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">17<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">button<\/span><span class=\"p\">.<\/span><span class=\"na\">addActionListener<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">ActionListener<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">18<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nd\">@Override<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">19<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">actionPerformed<\/span><span class=\"p\">(<\/span><span class=\"n\">ActionEvent<\/span><span class=\"w\"> <\/span><span class=\"n\">e<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">20<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;Anonymous class&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">21<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">22<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">});<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">23<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">24<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>"},{"title":"JDK 8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u5199\u6cd5","link":"https:\/\/yanbin.blog\/jdk-8-lambda-2-expression\/","pubDate":"Sat, 12 Oct 2013 11:00:53 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk-8-lambda-2-expression\/","description":"\n\u8fc7\u53bb\uff0c\u6211\u4eec\u4f7f\u7528\u533f\u540d\u7c7b\u7684\u5b9e\u73b0\u50cf\u00a0 ActionListener \u8fd9\u6837\u7684\u63a5\u53e3\uff0c\u5373\u4f7f\u6700\u7b80\u5355\u7684\u60c5\u666f\u90fd\u9700\u8981\u5199\u4e0a\u4e94\u516d\u884c\u4ee3\u7801\uff0c\u8fd9\u5c31\u663e\u5f97\u6709\u4e9b\u7d2f\u8d58\u4e86\u3002\u56e0\u4e3a\u5176\u5b9e\u6211\u4eec\u5728 new ActionListener {} \u65f6\u5c31\u662f\u5728\u521b\u5efa\u4e00\u4e2a ActionListener \u5b50\u7c7b\u578b\uff0c\u91cd\u8f7d\u4e86\u65b9\u6cd5\uff0c\u5e76\u521d\u59cb\u5316\u4e00\u4e2a\u5b9e\u4f8b\u51fa\u6765\u3002\u73b0\u5728\u6211\u4eec\u624b\u4e0a\u6709\u4e86 Lambda \u8868\u8fbe\u5f0f\u8fd9\u4e00\u6b66\u5668\u7684\u8bdd\uff0c\u5c31\u53d8\u5f97\u7b80\u5355\u660e\u4e86\u4e86\uff0c\u6240\u4ee5\u8bf4\u00a0 Lambda \u662f\u4e00\u79cd\u8f7b\u91cf\u7ea7\u7684\u5b9e\u73b0\u673a\u5236\u3002<\/p>\n<br\/>\n\u8fd9\u91cc\u662f\u51e0\u4e2a Lambda \u8868\u8fbe\u5f0f\u7684\u6837\u5b50\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"p\">(<\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">x<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">y<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">x<\/span><span class=\"w\"> <\/span><span class=\"o\">+<\/span><span class=\"w\"> <\/span><span class=\"n\">y<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u4e24\u6574\u5f62\u53c2\u6570\uff0c\u8fd4\u56de\u5b83\u4eec\u7684\u548c<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">42<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u65e0\u53c2\u6570\uff0c\u76f4\u63a5\u8fd4\u56de 42<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"n\">x<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">100<\/span><span class=\"p\">;<\/span><span class=\"w\"> <\/span><span class=\"c1\">\/\/\u53ef\u63a8\u65ad\u51fa\u53c2\u6570 x \u7684\u7c7b\u578b<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">s<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\"> <\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span><span class=\"p\">);<\/span><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\"> <\/span><span class=\"o\">\/\/<\/span><span class=\"n\">\u4f20\u5165\u4e00\u4e2a\u5b57\u7b26<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">\u53ea\u6267\u884c\u4e00\u4e2a\u64cd\u4f5c<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">\u65e0\u8fd4\u56de\u503c<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\nLambda \u7684\u683c\u5f0f\u5c31\u662f\u4e09\u90e8\u5206\uff1a\u53c2\u6570\u5217\u8868\uff0c-&gt; \u5206\u9694\u7b26\uff0c\u6267\u884c\u4f53\u3002\u5176\u4ed6\u8bed\u65b9\u7684 Lambda \u683c\u5f0f\u90fd\u8fd9\u6837\u7684\uff0c\u53ef\u80fd\u5c31\u662f\u5206\u9694\u7b26\u4e0d\u4e00\u6837\uff0c\u5982 Ruby \u7684 |\uff0cScala \u7684 =&gt; \u7b49\u3002<br\/><br\/>\n\u6267\u884c\u4f53\u91cc\u7684 return \u53ea\u662f\u6807\u660e\u8fd4\u56de\u5230\u533f\u540d\u65b9\u6cd5\u7684\u8c03\u7528\u8005\uff0c\u4e0d\u662f\u8fd4\u56de\u503c\u7684\u610f\u601d\uff1b \u6700\u4e0a\u5c42\u662f\u4e0d\u80fd\u7528 break \u548c continue \u5173\u952e\u5b57\u7684\uff0c\u53ef\u7528\u5728\u5faa\u73af\u4e2d\uff1b \u5982\u679c Lambda \u8868\u8fbe\u5f0f\u6709\u8fd4\u56de\u503c\uff0c\u90a3\u4e48\u5728\u6bcf\u4e00\u6761\u8def\u5f84\u4e0a\u90fd\u8981\u6709\u8fd4\u56de\u503c\u6216\u662f\u629b\u51fa\u5f02\u5e38\u3002\u8def\u5f84\u4e0a\u6700\u540e\u4e00\u6761\u8bed\u53e5\u7684\u8fd4\u56de\u503c\u5373\u4e3a Lambda \u8868\u8fbe\u7684\u8fd4\u56de\u503c\u3002"},{"title":"JDK 8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u5e94\u7528\u80cc\u666f","link":"https:\/\/yanbin.blog\/jdk-8-lambda-1-background\/","pubDate":"Fri, 11 Oct 2013 11:00:15 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk-8-lambda-1-background\/","description":"\n\u5373\u5c06\u5230\u6765\u7684 JDK8 \u6700\u4e3a\u5f15\u4eba\u5165\u80dc\u4e4b\u5904\u975e Lambda \u8868\u8fbe\u5f0f\u83ab\u6570\u4e86\uff0c\u8fd9\u5728\u5176\u4ed6\u52a8\u6001\u8bed\u65b9\uff0c\u5982 Ruby, Groovy, Scala \u7b49\u8bed\u8a00\u4e2d\u65e9\u5df2\u5927\u884c\u5176\u9053\u3002\u4e00\u65e6 JDK \u642d\u4e0a\u4e86 Lambda \u8fd9\u8d9f\u8f66\uff0c\u4ece\u6b64\u64cd\u4f5c\u4e8b\u4ef6\uff0c\u7ebf\u7a0b\uff0c\u5904\u7406\u96c6\u5408\u65f6\u53c8\u5927\u4e3a\u65b9\u4fbf\u4e86\u3002\u5173\u4e8e\u73b0\u9636\u6bb5\u5982\u4f55\u4f53\u9a8c JDK8 \u7684\u7279\u6027\u53ef\u4ee5\u53c2\u8003\n<a title=\"\u62a2\u9c9c\u8bbe\u7f6e JDK8 \u7684\u7f16\u7a0b\u73af\u5883\uff0c\u5370\u8c61\" href=\"https:\/\/yanbin.blog\/setting-jdk8-programming-environment\" target=\"_blank\">\u62a2\u9c9c\u8bbe\u7f6e JDK8 \u7684\u7f16\u7a0b\u73af\u5883\uff0c\u5370\u8c61<\/a>\u3002<br\/>\n<br\/>\n\u672c\u6587\u4e3b\u8981\u53c2\u8003\u4e8e\u5b98\u65b9\u7684 <a href=\"http:\/\/cr.openjdk.java.net\/~briangoetz\/lambda\/lambda-state-final.html\" target=\"_blank\">State of the Lambda<\/a>\uff0c\u5e76\u5bf9\u6e90\u7801\u6216\u53cd\u7f16\u8bd1\u51fa\u5b57\u8282\u7801\uff0c\u4f5c\u4e00\u5b9a\u7684\u6df1\u5165\u4ee5\u52a9\u4e8e\u5404\u4f4d\u7406\u89e3\uff0c\u5728 JVM \u4e2d\u662f\u5982\u4f55\u5b9e\u73b0 Lambda \u7684\u3002<br\/>\n<br\/>\nLambda \u8868\u8fbe\u5f0f\uff0c\u53c8\u79f0\u95ed\u5305(Closure)\uff0c\u6216\u79f0\u533f\u540d\u65b9\u6cd5(anonymous method)\u3002\u8fd9\u5728\u5176\u4ed6\u8bed\u8a00\u4e2d\uff0c\u5982 Ruby, Groovy, Scala, JavaScript \u7b49\uff0c\u751a\u81f3\u662f\u5728 C# \u4e2d\u8fd0\u7528\u5f97\u5982\u706b\u7eaf\u6e05\u7684\u7279\u6027\uff0cJDK8 \u8fd9\u624d\u95ee\u5019\u4ed6\uff0c\u771f\u6709\u4e9b\u665a\u4e86\u3002\u6ca1\u6709&nbsp;Lambda \u65f6\uff0cJava \u4e0d\u5f97\u4e0d\u6c42\u52a9\u4e8e\u533f\u540d\u7c7b\u7684\u56de\u8c03\u65b9\u6cd5\u6765\u8fbe\u5230\u76f8\u4f3c\u7684\u76ee\u7684\uff0c\u4e3a\u4e86\u6355\u83b7\u5916\u90e8\u53d8\u91cf\uff0c\u53d8\u91cf\u5fc5\u987b\u58f0\u660e\u4e3a final\u3002<br\/>\n<br\/>\n\u4e00\u89c1\u5230&nbsp;Lambda\uff0c\u7b2c\u4e00\u4e2a\u53cd\u5e94\u5c31\u662f&nbsp;Lambda \u8868\u8fbe\u5f0f(\u5c40\u90e8\u800c\u5df2)\uff0c\u5176\u5b9e\u6211\u4eec\u8fd9\u91cc\u8981\u8bf4\u7684 JDK8 \u7684&nbsp;Lambda \u5305\u542b\u4ee5\u4e0b\u51e0\u5757\u5185\u5bb9\uff1a<br\/>\n<ol>\n<li>Lambda \u8868\u8fbe\u5f0f\uff0c\u4fd7\u79f0\u95ed\u5305\u6216\u533f\u540d\u65b9\u6cd5<\/li>\n<li>\u65b9\u6cd5\u548c\u6784\u9020\u5668\u5f15\u7528<\/li>\n<li>\u6269\u5145\u7684\u76ee\u6807\u7c7b\u578b\u548c\u66f4\u5f3a\u7684\u7c7b\u578b\u63a8\u65ad<\/li>\n<li>\u63a5\u53e3\u4e2d\u7684\u9ed8\u8ba4\u9759\u6001\u65b9\u6cd5<\/li>\n<\/ol>\nLambda \u8fd9\u4e00\u7279\u6027\u4f7f\u5f97 Java \u4e5f\u5f00\u59cb\u5411\u51fd\u6570\u5f0f\u7f16\u7a0b\u503e\u659c\uff0c\u5173\u952e\u662f\u80fd\u66f4\u6709\u6548\u7684\u5e94\u5bf9\u5e76\u53d1\u73af\u5883\u3002<br\/>\n<br\/>\n\u8bf4\u5230&nbsp;Lambda\uff0c\u6211\u4eec\u4e0d\u5f97\u4e0d\u4e86\u89e3\u4e00\u4e0b\u5f53\u524d\u80cc\u666f\uff0c\u4f8b\u5982\u4e0b\u9762\u4e00\u4e2a\u5178\u578b\u7684\u4e8b\u4ef6\u5904\u7406\u573a\u666f\uff1a"}]}}