Tag: lambda

重新定义C ++ 11中不允许的lambdas,为什么?

例: #include <functional> int main() { auto test = []{}; test = []{}; return 0; } 这会在gcc 4.7.2中发出以下错误消息: test.cpp: In function 'int main()': test.cpp:5:13: error: no match for 'operator=' in 'test = <lambda closure object>main()::<lambda()>{}' test.cpp:5:13: note: candidate is: test.cpp:4:16: note: main()::<lambda()>& main()::<lambda()>::operator=(const main()::<lambda()>&) <deleted> test.cpp:4:16: note: no known conversion for argument 1 from 'main()::<lambda()>' […]

为什么消费者接受与陈述体而不是expression体的lambdas?

下面的代码令人惊讶的是编译成功: Consumer<String> p = ""::equals; 这个也是: p = s -> "".equals(s); 但是,这是失败的错误boolean cannot be converted to void的预期: p = s -> true; 用括号修改第二个例子也失败了: p = s -> ("".equals(s)); 这是Java编译器中的错误还是有我不知道的types推理规则?

Java 8:java.util.function中的TriFunction(和kin)在哪里? 或者有什么select?

我看到java.util.function.BiFunction,所以我可以这样做: BiFunction<Integer, Integer, Integer> f = (x, y) -> { return 0; }; 如果这不够好,我需要TriFunction? 它不存在! TriFunction<Integer, Integer, Integer, Integer> f = (x, y, z) -> { return 0; }; 我想我应该补充一点,我知道我可以定义我自己的TriFunction,我只是想了解没有包含在标准库中的基本原理。

Java 8:使用换行符和缩进格式化lambda

我想用lambda缩进实现如下: 多线声明: String[] ppl = new String[] { "Karen (F)", "Kevin (M)", "Lee (M)", "Joan (F)", "Des (M)", "Rick (M)" }; List<String> strings = Arrays.stream(ppl) .filter( (x) -> { return x.contains("(M)"); } ).collect(Collectors.toList()); strings.stream().forEach(System.out::println); 单行声明: List<String> strings = Arrays.stream(ppl) .map((x) -> x.toUpperCase()) .filter((x) -> x.contains("(M)")) .collect(Collectors.toList()); 目前,Eclipse正在自动格式化为以下内容: 多线声明: String[] ppl = new String[] { "Karen […]

函数返回一个lambdaexpression式

我不知道是否有可能编写一个函数,返回在C ++ 11中的lambda函数。 当然一个问题是如何声明这样的function。 每个lambda都有一个types,但是这种types在C ++中是不可expression的。 我不认为这会工作: auto retFun() -> decltype ([](int x) -> int) { return [](int x) { return x; } } 也不是这样: int(int) retFun(); 我不知道从lambdas到指向函数的指针等的自动转换。 是唯一的解决scheme手工制作一个函数对象并返回它?

在Java 8中迭代枚举

是否有可能通过使用Lambdaexpression式迭代Enumeration ? 以下代码片段的Lambda表示是什么: Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); while (nets.hasMoreElements()) { NetworkInterface networkInterface = nets.nextElement(); } 我没有发现任何stream。

C ++ 11 std :: set lambda比较函数

我想用自定义比较函数创build一个std::set 。 我可以将它定义为一个带有operator()的类,但我希望能够定义一个lambda函数,因此我决定在类的构造函数的初始化列表中定义lambda函数,该类的std::set成员。 但是我不能得到lambda的types。 在我继续之前,这里是一个例子: class Foo { private: std::set<int, /*???*/> numbers; public: Foo () : numbers ([](int x, int y) { return x < y; }) { } }; 我search后发现两个解决scheme:一个,使用std::function 。 只要设置比较函数types为std::function<bool (int, int)>并像我一样传递lambda。 第二个解决scheme是写一个make_set函数,就像std::make_pair 。 解决scheme1: class Foo { private: std::set<int, std::function<bool (int, int)> numbers; public: Foo () : numbers ([](int x, int […]

C ++ Lambdas:“可变”和“引用捕获”之间的区别

在C ++中,你可以像这样声明lambdaexpression式: int x = 5; auto a = [=]() mutable { ++x; std::cout << x << '\n'; }; auto b = [&]() { ++x; std::cout << x << '\n'; }; 都让我修改x ,那有什么区别?

什么是C ++ lambdaexpression式的生命周期?

(我已经读过C ++中lambda派生的隐式函子的生命周期了 ,它并没有回答这个问题。) 我明白,C ++ lambda语法只是用一个调用操作符和某个状态来创build一个匿名类的实例,而我理解该状态的生命周期需求(由是否通过引用的值捕获来决定)。 lambda对象本身的生命周期? 在下面的例子中,返回的std::function实例是否有用? std::function<int(int)> meta_add(int x) { auto add = [x](int y) { return x + y; }; return add; } 如果是,它是如何工作的 ? 这似乎有点太神奇了 – 我只能想象它通过std::function复制我的整个实例,这可能是非常沉重取决于我所捕获的 – 在过去,我已经使用std::function主要与裸函数指针,并复制这些很快。 从std::function的types擦除来看,它也有问题。

如何使用Java8 lambda按相反顺序对stream进行sorting?

我使用java lambdasorting列表。 我怎样才能以相反的方式sorting呢? 我看到这个post ,但我想用java 8 lambda。 这里是我的代码(我用* 1)作为黑客 Arrays.asList(files).stream() .filter(file -> isNameLikeBaseLine(file, baseLineFile.getName())) .sorted(new Comparator<File>() { public int compare(File o1, File o2) { int answer; if (o1.lastModified() == o2.lastModified()) { answer = 0; } else if (o1.lastModified() > o2.lastModified()) { answer = 1; } else { answer = -1; } return -1 * answer; […]