Tag: lambda

将expression式parameter passing给另一个expression式的参数

我有一个查询过滤结果: public IEnumerable<FilteredViewModel> GetFilteredQuotes() { return _context.Context.Quotes.Select(q => new FilteredViewModel { Quote = q, QuoteProductImages = q.QuoteProducts.SelectMany(qp => qp.QuoteProductImages.Where(qpi => q.User.Id == qpi.ItemOrder)) }); } 在where子句中,我使用参数q来匹配属性和参数qpi中的属性。 因为filter将在几个地方使用,我试图重写where子句的expression式树,看起来像这样: public IEnumerable<FilteredViewModel> GetFilteredQuotes() { return _context.Context.Quotes.Select(q => new FilteredViewModel { Quote = q, QuoteProductImages = q.QuoteProducts.SelectMany(qp => qp.QuoteProductImages.AsQueryable().Where(ExpressionHelper.FilterQuoteProductImagesByQuote(q))) }); } 在这个查询中,参数q被用作函数的一个参数: public static Expression<Func<QuoteProductImage, bool>> FilterQuoteProductImagesByQuote(Quote quote) { […]

java lambda返回一个lambda

我正在尝试在function性编程的新jdk8版本中做一个相对基本的东西,但是不能得到它的工作。 我有这个工作代码: import java.util.*; import java.util.concurrent.*; import java.util.stream.*; public class so1 { public static void main() { List<Number> l = new ArrayList<>(Arrays.asList(1, 2, 3)); List<Callable<Object>> checks = l.stream(). map(n -> (Callable<Object>) () -> { System.out.println(n); return null; }). collect(Collectors.toList()); } } 它需要一个数字列表,并产生一个可以打印出来的函数列表。 然而,对Callable的显式转换似乎是多余的。 这似乎对我和IntelliJ。 我们都同意,这也应该工作: List<Callable<Object>> checks = l.stream(). map(n -> () -> { System.out.println(n); […]

如何创buildPython lambdas列表(在列表理解/ for循环中)?

我想从Python中的常量列表创build一个lambda对象的列表; 例如: listOfNumbers = [1,2,3,4,5] square = lambda x: x * x listOfLambdas = [lambda: square(i) for i in listOfNumbers] 这将创build一个lambda对象的列表,但是,当我运行它们时: for f in listOfLambdas: print f(), 我希望能打印出来 1 4 9 16 25 相反,它打印: 25 25 25 25 25 似乎lambda都被给了错误的参数。 我做错了什么,有没有办法解决这个问题? 我在Python 2.4我想。 编辑:多一点尝试的东西,这样的想法: listOfLambdas = [] for num in listOfNumbers: action = lambda: square(num) […]

在SICP中使用lambda作为cons / car / cdr定义

我刚刚开始觉得我对于在球拍和scheme中使用lambda有一个模糊的理解,当我在SICP中遇到以下“替代”缺陷和汽车的定义 (define (cons xy) (lambda (m) (mxy))) (define (car z) (z (lambda (pq) p))) (define (cdr z) (z (lambda (pq) q))) 对于我的生活,我只是不能parsing它们。 任何人都可以解释如何parsing或扩展这些对于新手来说是有意义的吗?

如何获取Java 8方法引用的MethodInfo?

请看下面的代码: Method methodInfo = MyClass.class.getMethod("myMethod"); 这个工作,但方法名称是作为一个string传递,所以即使myMethod不存在,这将编译。 另一方面,Java 8引入了一个方法引用特性。 在编译时检查。 有可能使用此function获取方法信息? printMethodName(MyClass::myMethod); 完整的例子: @FunctionalInterface private interface Action { void invoke(); } private static class MyClass { public static void myMethod() { } } private static void printMethodName(Action action) { } public static void main(String[] args) throws NoSuchMethodException { // This works, but method name is passed […]

Lambdaexpression式和方法重载疑惑

好的,所以方法重载是一件坏事。 现在,这已经解决了,让我们假设我真的想重载像这样的方法: static void run(Consumer<Integer> consumer) { System.out.println("consumer"); } static void run(Function<Integer, Integer> function) { System.out.println("function"); } 在Java 7中,我可以用非歧义的匿名类作为参数轻松地调用它们: run(new Consumer<Integer>() { public void accept(Integer integer) {} }); run(new Function<Integer, Integer>() { public Integer apply(Integer o) { return 1; } }); 现在在Java 8中,我想用lambdaexpression式来调用这些方法,我可以! // Consumer run((Integer i) -> {}); // Function run((Integer i) -> 1); […]

我可以指定我的显式types比较内联?

所以.NET 3.0 / 3.5为我们提供了很多新的方法来查询,sorting和操作数据,这要感谢LINQ提供的所有整齐的函数。 有时,我需要比较没有内置比较运算符的用户定义types。 在许多情况下,比较非常简单 – 例如foo1.key?= foo2.key。 而不是创build一个新的IEqualityComparer的types,我可以简单地指定使用匿名委托/ lambda函数内联比较? 就像是: var f1 = …, f2 = …; var f3 = f1.Except( f2, new IEqualityComparer( (Foo a, Foo b) => a.key.CompareTo(b.key) ) ); 我很确定上述不实际工作。 我只是不想为了告诉程序如何将苹果与苹果进行比较,而不得不像整个class级那样做一些“沉重的事情”。

是否使用lambda函数/expression式支持constexpr?

struct Test { static const int value = []() -> int { return 0; } (); }; 有了gcc-4.6,我得到了类似的error: function needs to be constexpr 。 我尝试过在各个地方放置constexpr多种组合,但没有运气。 是否也支持lambda函数的constexpr (不pipe是否指定returntypes)? 什么是正确的语法? 任何可能的工作?

Java-8中“function接口”的精确定义

最近我开始研究Java 8,我不能完全理解Java实现lambdaexpression式所必需的“function接口”的概念。 在Java中有一个非常全面的 lambda函数的指南 ,但是我陷入了定义函数接口概念的章节 。 定义如下: 更确切地说,一个function接口被定义为只有一个抽象方法的任何接口。 然后他继续举例,其中一个是“比较器”界面: public interface Comparator {int compare(T o1,T o2); boolean equals(Object obj); } 我能够testing,我可以使用lambda函数来代替Comparator参数,它的工作原理(即Collections.sort(list, (a, b) -> ab) )。 但是在Comparator接口中,compare()和equals()方法都是抽象的,这意味着它有两个抽象方法 。 那么如果定义需要一个接口只有一个抽象方法 ,那么这怎么可能呢? 我在这里错过了什么?

复制stream以避免“stream已经被操作或closures”(Java 8)

我想复制一个Java 8stream,以便我可以处理它两次。 我可以collect一个列表,并从中获得新的stream; // doSomething() returns a stream List<A> thing = doSomething().collect(toList()); thing.stream()… // do stuff thing.stream()… // do other stuff 但我认为应该有一个更高效/优雅的方式。 有没有办法复制stream而不把它变成一个集合? 实际上,我正在处理任意一个stream,所以我们需要先处理左侧的投影,然后再移动到正确的投影中,然后用另一种方式处理。 有点像这样(到目前为止,我不得不使用toList技巧)。 List<Either<Pair<A, Throwable>, A>> results = doSomething().collect(toList()); Stream<Pair<A, Throwable>> failures = results.stream().flatMap(either -> either.left()); failures.forEach(failure -> … ); Stream<A> successes = results.stream().flatMap(either -> either.right()); successes.forEach(success -> … );