คำถามติดแท็ก lambda

อย่าใช้บริการ AWS (ใช้ [aws-lambda] สำหรับคำถามเหล่านั้น!) Lambdas เป็นฟังก์ชั่นนิรนามหรือการปิดในภาษาโปรแกรมเช่น Lisp, C #, C ++, Lua, Python, Ruby, JavaScript หรือ Java (เช่นเดียวกันกับแลมบ์ดานิพจน์)

14
Java 8 สตรีมเพื่อค้นหาองค์ประกอบที่ซ้ำกัน
ฉันกำลังพยายามแสดงรายการองค์ประกอบที่ซ้ำกันในรายการจำนวนเต็มพูดเช่น List<Integer> numbers = Arrays.asList(new Integer[]{1,2,1,3,4,4}); ใช้ Streams ของ jdk 8 มีใครลองบ้าง ในการลบรายการที่ซ้ำกันเราสามารถใช้ API ที่แตกต่างกัน () แต่การค้นหาองค์ประกอบที่ซ้ำกันล่ะ? ใครสามารถช่วยฉันออก?

12
ตัวชี้ฟังก์ชันการปิดและแลมด้า
ตอนนี้ฉันเพิ่งเรียนรู้เกี่ยวกับตัวชี้ฟังก์ชันและในขณะที่ฉันกำลังอ่านบท K&R ในเรื่องนี้สิ่งแรกที่โดนใจฉันคือ "เฮ้นี่มันเหมือนกับการปิด" ฉันรู้ว่าสมมติฐานนี้ผิดโดยพื้นฐานแล้วและหลังจากการค้นหาทางออนไลน์ฉันไม่พบการวิเคราะห์ใด ๆ เกี่ยวกับการเปรียบเทียบนี้เลย เหตุใดตัวชี้ฟังก์ชันสไตล์ C จึงแตกต่างจากการปิดหรือแลมบ์ดาโดยพื้นฐาน? เท่าที่ฉันสามารถบอกได้ว่ามันเกี่ยวข้องกับความจริงที่ว่าตัวชี้ฟังก์ชันยังคงชี้ไปที่ฟังก์ชันที่กำหนด (ชื่อ) ซึ่งตรงข้ามกับการฝึกกำหนดฟังก์ชันโดยไม่ระบุตัวตน เหตุใดการส่งผ่านฟังก์ชันไปยังฟังก์ชันจึงถูกมองว่ามีประสิทธิภาพมากกว่าในกรณีที่สองโดยที่ไม่มีชื่อมากกว่าฟังก์ชันแรกที่เป็นเพียงฟังก์ชันปกติในชีวิตประจำวันที่ถูกส่งผ่าน โปรดบอกฉันว่าทำไมฉันถึงคิดผิดที่เปรียบเทียบทั้งสองอย่างใกล้ชิด ขอบคุณ.

6
Java 8 Lambda Expressions - วิธีการหลายอย่างในคลาสที่ซ้อนกัน
ฉันกำลังอ่านเกี่ยวกับคุณสมบัติใหม่ที่: http://www.javaworld.com/article/2078836/java-se/love-and-hate-for-java-8.html ฉันเห็นตัวอย่างด้านล่าง: การใช้คลาส Anonymous: button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { System.out.println("Action Detected"); } }); ด้วย Lambda: button.addActionListener(e -> { System.out.println("Action Detected"); }); บางคนจะทำอย่างไรกับ a MouseListenerถ้าพวกเขาต้องการใช้หลายวิธีในคลาสที่ไม่ระบุตัวตนเช่น public void mousePressed(MouseEvent e) { saySomething("Mouse pressed; # of clicks: " + e.getClickCount(), e); } public void mouseReleased(MouseEvent e) { saySomething("Mouse released; …

4
เหตุใด Java 8 lambda นี้จึงไม่สามารถคอมไพล์ได้
คอมไพล์โค้ด Java ต่อไปนี้ไม่สำเร็จ: @FunctionalInterface private interface BiConsumer<A, B> { void accept(A a, B b); } private static void takeBiConsumer(BiConsumer<String, String> bc) { } public static void main(String[] args) { takeBiConsumer((String s1, String s2) -> new String("hi")); // OK takeBiConsumer((String s1, String s2) -> "hi"); // Error } คอมไพเลอร์รายงาน: Error:(31, 58) …

5
วิธีรับแอดเดรสของฟังก์ชันแลมบ์ดา C ++ ภายในแลมบ์ดาเองได้อย่างไร
ฉันกำลังพยายามหาวิธีรับที่อยู่ของฟังก์ชันแลมบ์ดาภายในตัวเอง นี่คือตัวอย่างรหัส: []() { std::cout << "Address of this lambda function is => " << ???? }(); ฉันรู้ว่าฉันสามารถจับแลมบ์ดาในตัวแปรและพิมพ์ที่อยู่ได้ แต่ฉันต้องการทำสิ่งนี้เมื่อฟังก์ชันที่ไม่ระบุตัวตนกำลังดำเนินการ มีวิธีที่ง่ายกว่านี้หรือไม่?
53 c++  c++11  lambda  c++14  c++17 

4
ทำไมแลมบ์ดาส่งคืนชนิดไม่ตรวจสอบในเวลารวบรวม?
Integerอ้างอิงวิธีการที่ใช้มีชนิดกลับ แต่ไม่สามารถใช้ร่วมกันStringได้ในตัวอย่างต่อไปนี้ วิธีแก้ไขการwithประกาศวิธีการเพื่อให้ได้รับการอ้างอิงประเภทวิธีการที่ปลอดภัยโดยไม่ต้องหล่อด้วยตนเอง? import java.util.function.Function; public class MinimalExample { static public class Builder<T> { final Class<T> clazz; Builder(Class<T> clazz) { this.clazz = clazz; } static <T> Builder<T> of(Class<T> clazz) { return new Builder<T>(clazz); } <R> Builder<T> with(Function<T, R> getter, R returnValue) { return null; //TODO } } static public interface …

6
มีวิธีในการประกาศแลมบ์ดา C # และเรียกมันทันทีหรือไม่?
เป็นไปได้ที่จะประกาศฟังก์ชั่นแลมบ์ดาและเรียกมันว่า: Func<int, int> lambda = (input) => { return 1; }; int output = lambda(0); ฉันสงสัยว่ามันเป็นไปได้ที่จะทำเช่นนั้นในหนึ่งบรรทัดเช่นบางสิ่งบางอย่าง int output = (input) => { return 1; }(0); ซึ่งให้ข้อผิดพลาดคอมไพเลอร์ "คาดว่าชื่อวิธี" กำลังส่งไปที่Func<int, int>ไม่ทำงาน: int output = (Func<int, int>)((input) => { return 1; })(0); ให้ข้อผิดพลาดเดียวกันและด้วยเหตุผลที่กล่าวถึงด้านล่างฉันต้องการหลีกเลี่ยงการระบุประเภทอาร์กิวเมนต์อินพุต (อย่างแรกint) อย่างชัดเจน คุณอาจสงสัยว่าทำไมint output = 1;ฉันต้องการที่จะทำเช่นนี้แทนเพียงฝังโค้ดโดยตรงตัวอย่างเช่น เหตุผลมีดังต่อไปนี้: ฉันได้สร้างการอ้างอิงสำหรับเว็บเซอร์วิส SOAP ด้วยsvcutilเนื่องจากองค์ประกอบซ้อนกันสร้างชื่อคลาสที่ยาวมากซึ่งฉันต้องการหลีกเลี่ยงการพิมพ์ออกมา …
29 c#  lambda 

3
ทำไมการคอมไพล์ตกลงเมื่อฉันใช้เมธอด Invoke และไม่ตกลงเมื่อฉันกลับ Func <int, int> โดยตรง?
ฉันไม่เข้าใจกรณีนี้: public delegate int test(int i); public test Success() { Func&lt;int, int&gt; f = x =&gt; x; return f.Invoke; // &lt;- code successfully compiled } public test Fail() { Func&lt;int, int&gt; f = x =&gt; x; return f; // &lt;- code doesn't compile } ทำไมการคอมไพล์ตกลงเมื่อฉันใช้Invokeวิธีการและไม่ตกลงเมื่อฉันกลับcsharp Func&lt;int,int&gt;โดยตรง?
28 c#  lambda  delegates 

2
เมื่อแลมบ์ดาจับตัวนี้แล้วจะต้องใช้อย่างชัดเจนหรือไม่?
ตัวอย่างที่ฉันพบว่าการจับภาพthisในแลมบ์ดาใช้อย่างชัดเจน เช่น: capturecomplete = [this](){this-&gt;calstage1done();}; แต่ดูเหมือนว่ามันเป็นไปได้ที่จะใช้มันโดยปริยาย เช่น: capturecomplete = [this](){calstage1done();}; ฉันทดสอบสิ่งนี้ใน g ++ และรวบรวมมัน C ++ มาตรฐานนี้หรือไม่ (และถ้าเป็นเช่นนั้นเวอร์ชันใด) หรือเป็นรูปแบบของส่วนขยายบางส่วน

1
เหตุใดฉันจึงประกาศตัวแปรลูกที่มีชื่อเดียวกันกับตัวแปรในขอบเขตพาเรนต์
ฉันเขียนโค้ดบางส่วนเมื่อเร็ว ๆ นี้ซึ่งฉันนำชื่อตัวแปรมาใช้ซ้ำโดยไม่ได้ตั้งใจเป็นพารามิเตอร์ของการดำเนินการที่ประกาศไว้ในฟังก์ชันที่มีตัวแปรชื่อเดียวกันอยู่แล้ว ตัวอย่างเช่น: var x = 1; Action&lt;int&gt; myAction = (x) =&gt; { Console.WriteLine(x); }; เมื่อฉันเห็นการทำสำเนาฉันรู้สึกประหลาดใจเมื่อเห็นว่าโค้ดรวบรวมและทำงานได้อย่างสมบูรณ์แบบซึ่งไม่ใช่พฤติกรรมที่ฉันคาดหวังจากสิ่งที่ฉันรู้เกี่ยวกับขอบเขตใน C # บาง Googling รวดเร็วเปิดขึ้นดังนั้นคำถามที่บ่นว่ารหัสที่คล้ายกันไม่สร้างข้อผิดพลาดเช่นแลมบ์ดาขอบเขตชี้แจง (ฉันวางโค้ดตัวอย่างนั้นลงใน IDE ของฉันเพื่อดูว่ามันจะทำงานได้หรือไม่เพื่อให้แน่ใจว่ามันจะทำงานได้อย่างสมบูรณ์) นอกจากนี้เมื่อฉันป้อนกล่องโต้ตอบเปลี่ยนชื่อใน Visual Studio สิ่งแรกxจะถูกเน้นเป็นชื่อที่ขัดแย้งกัน ทำไมรหัสนี้ใช้งานได้? ฉันใช้ C # 8 กับ Visual Studio 2019

3
ความแตกต่างของพฤติกรรมของฟังก์ชั่นแลมบ์ดาที่จับได้ไม่แน่นอนจากการอ้างอิงถึงตัวแปรทั่วโลก
ฉันพบว่าผลลัพธ์นั้นแตกต่างกันในคอมไพเลอร์ถ้าฉันใช้แลมบ์ดาเพื่อจับการอ้างอิงไปยังตัวแปรทั่วโลกด้วยคำสำคัญที่ไม่แน่นอนและปรับเปลี่ยนค่าในฟังก์ชั่นแลมบ์ดา #include &lt;stdio.h&gt; #include &lt;functional&gt; int n = 100; std::function&lt;int()&gt; f() { int &amp;m = n; return [m] () mutable -&gt; int { m += 123; return m; }; } int main() { int x = n; int y = f()(); int z = n; printf("%d %d %d\n", x, y, …

2
มาโครแลมบ์ดาสร้างแลมบ์ดาได้อย่างไร
ฉันพบรหัสชิ้นนี้ใน GitHub แต่ไม่เข้าใจ: #define lambda(ret_type, _body) ({ ret_type _ _body _; }) แล้ว: int (*max)(int, int) = lambda(int, (int x, int y) { return x &gt; y ? x : y; }); int max_value = max(1, 2); // max_value is 2 ขีดล่างทำในสิ่งใด#defineและมันคืนตัวชี้ฟังก์ชันได้อย่างไร

3
ค่าปิดของแลมบ์ดาสามารถส่งผ่านเป็นพารามิเตอร์อ้างอิง rvalue ได้
ฉันพบว่าการlvalueปิดแลมบ์ดาสามารถส่งผ่านเป็นrvalueพารามิเตอร์ฟังก์ชันได้เสมอ ดูการสาธิตง่ายๆดังต่อไปนี้ #include &lt;iostream&gt; #include &lt;functional&gt; using namespace std; void foo(std::function&lt;void()&gt;&amp;&amp; t) { } int main() { // Case 1: passing a `lvalue` closure auto fn1 = []{}; foo(fn1); // works // Case 2: passing a `lvalue` function object std::function&lt;void()&gt; fn2 = []{}; foo(fn2); // compile error return 0; } …

3
โอเวอร์โหลดฟังก์ชั่นแลมบ์ดา
วิธีโอเวอร์โหลดฟังก์ชั่นแลมบ์ดาแบบง่าย ๆ ในท้องถิ่น? SSE ของปัญหาดั้งเดิม: #include &lt;iostream&gt; #include &lt;map&gt; void read() { static std::string line; std::getline(std::cin, line); auto translate = [](int idx) { constexpr static int table[8]{ 7,6,5,4,3,2,1,0 }; return table[idx]; }; auto translate = [](char c) { std::map&lt;char, int&gt; table{ {'a', 0}, {'b', 1}, {'c', 2}, {'d', 3}, {'e', …

1
แลมบ์ดาที่ไม่มีการรับประกันรับประกันว่าจะว่างเปล่าตามมาตรฐานหรือไม่?
ฉันกำลังค้นหาวิธีที่จะระบุ lambdas ที่ว่างเปล่า (ไม่มีขอบเขต) จาก lambdas อื่น ๆ ในฟังก์ชั่นเทมเพลต ปัจจุบันฉันใช้ C ++ 17 แต่ฉันอยากรู้คำตอบ C ++ 20 ด้วย รหัสของฉันมีลักษณะเช่นนี้: template&lt;typename T&gt; auto func(T lambda) { // The aguments of the lambdas are unknown if constexpr (/* is captureless */) { // do stuff } } มันรับประกันโดยมาตรฐาน C ++ (17 หรือ …
12 c++  lambda  c++17  c++20 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.